annotate Lib/test/support.py @ 63948:aa89cbb7bc21

Oops, I did it again: add missing \ removed in previous commit
author Victor Stinner <victor.stinner@haypocalc.com>
date Fri, 13 Aug 2010 13:47:18 +0000
parents a449ce1f385b
children 291c9afab12c
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
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
13 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
14 import shutil
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
15 import warnings
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
16 import unittest
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
17 import importlib
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
18 import collections
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
19 import re
62874
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
20 import subprocess
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
21 import imp
60517
b4f60df31b14 Merged revisions 79934 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59720
diff changeset
22 import time
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
23 try:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
24 import _thread
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
25 except ImportError:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
26 _thread = None
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
27
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
28 __all__ = [
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
29 "Error", "TestFailed", "ResourceDenied", "import_module",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
30 "verbose", "use_resources", "max_memuse", "record_original_stdout",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
31 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
32 "is_resource_enabled", "requires", "find_unused_port", "bind_port",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
33 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
34 "findfile", "sortdict", "check_syntax_error", "open_urlresource",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
35 "check_warnings", "CleanImport", "EnvironmentVarGuard",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
36 "TransientResource", "captured_output", "captured_stdout",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
37 "time_out", "socket_peer_reset", "ioerror_peer_reset",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
38 "run_with_locale", 'temp_umask',
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
39 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
40 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
41 "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
62874
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
42 "swap_item", "swap_attr", "can_symlink", "skip_unless_symlink"]
47317
ba8015e23487 Merged revisions 63698 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
43
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
44
13682
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
45 class Error(Exception):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
46 """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
47
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
48 class TestFailed(Error):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
49 """Test failed."""
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50
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
51 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
52 """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
53
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
54 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
55 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
56 and unexpected skips.
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
57 """
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
58
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
59 @contextlib.contextmanager
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
60 def _ignore_deprecated_imports(ignore=True):
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
61 """Context manager to suppress package and module deprecation
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
62 warnings when importing them.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
63
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
64 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
65 if ignore:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
66 with warnings.catch_warnings():
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
67 warnings.filterwarnings("ignore", ".+ (module|package)",
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
68 DeprecationWarning)
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
69 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
70 else:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
71 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
72
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
73
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
74 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
75 """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
76 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
77
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
78 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
79 will be suppressed."""
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
80 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
81 try:
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
82 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
83 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
84 raise unittest.SkipTest(str(msg))
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
85
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
86
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
87 def _save_and_remove_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
88 """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
89
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
90 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
91 False otherwise."""
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
92 saved = True
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
93 try:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
94 orig_modules[name] = sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
95 except KeyError:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
96 saved = False
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
97 else:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
98 del sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
99 return saved
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
100
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
101
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
102 def _save_and_block_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
103 """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
104
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
105 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
106 False otherwise."""
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
107 saved = True
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
108 try:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
109 orig_modules[name] = sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
110 except KeyError:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
111 saved = False
62998
b5749dd8c421 Set sys.modules[name] to None instead of 0 to block module import.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62874
diff changeset
112 sys.modules[name] = None
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
113 return saved
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
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
116 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
117 """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
118 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
119 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
120
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
121 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
122
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
123 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
124 takes place.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
125
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
126 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
127 will be suppressed."""
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
128 # 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
129 # 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
130 with _ignore_deprecated_imports(deprecated):
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
131 # 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
132 # 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
133 orig_modules = {}
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
134 names_to_remove = []
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
135 _save_and_remove_module(name, orig_modules)
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
136 try:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
137 for fresh_name in fresh:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
138 _save_and_remove_module(fresh_name, orig_modules)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
139 for blocked_name in blocked:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
140 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
141 names_to_remove.append(blocked_name)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
142 fresh_module = importlib.import_module(name)
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
143 finally:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
144 for orig_name, module in orig_modules.items():
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
145 sys.modules[orig_name] = module
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
146 for name_to_remove in names_to_remove:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
147 del sys.modules[name_to_remove]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
148 return fresh_module
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
149
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
150
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
151 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
152 """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
153 try:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
154 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
155 except AttributeError:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
156 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
157 obj.__name__, name))
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
158 else:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
159 return attribute
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
160
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
161 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
162 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
163 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
164 # small sizes, to make sure they work.)
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
165 real_max_memuse = 0
4791
a2fd80eed27f Add verbose flag for regression test to clear.
Guido van Rossum <guido@python.org>
parents: 1197
diff changeset
166
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
167 # _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
168 # 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
169 # 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
170 _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
171 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
172 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
173 _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
174
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
175 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
176 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
177
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 def unload(name):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
179 try:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
180 del sys.modules[name]
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
181 except KeyError:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
182 pass
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
184 def unlink(filename):
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
185 try:
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
186 os.unlink(filename)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
187 except OSError as error:
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
188 # The filename need not exist.
61226
d49f1310e23f Fix error handling removing files in test.support.unlink
Michael Foord <fuzzyman@voidspace.org.uk>
parents: 61163
diff changeset
189 if error.errno not in (errno.ENOENT, errno.ENOTDIR):
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
190 raise
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
191
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
192 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
193 try:
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
194 shutil.rmtree(path)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
195 except OSError as error:
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
196 # Unix returns ENOENT, Windows returns ESRCH.
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
197 if error.errno not in (errno.ENOENT, errno.ESRCH):
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
198 raise
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
199
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
200 def make_legacy_pyc(source):
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
201 """Move a PEP 3147 pyc/pyo file to its legacy pyc/pyo location.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
202
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
203 The choice of .pyc or .pyo extension is done based on the __debug__ flag
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
204 value.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
205
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
206 :param source: The file system path to the source file. The source file
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
207 does not need to exist, however the PEP 3147 pyc file must exist.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
208 :return: The file system path to the legacy pyc file.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
209 """
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
210 pyc_file = imp.cache_from_source(source)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
211 up_one = os.path.dirname(os.path.abspath(source))
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
212 legacy_pyc = os.path.join(up_one, source + ('c' if __debug__ else 'o'))
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
213 os.rename(pyc_file, legacy_pyc)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
214 return legacy_pyc
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
215
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 def forget(modname):
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
217 """'Forget' a module was ever imported.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
218
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
219 This removes the module from sys.modules and deletes any PEP 3147 or
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
220 legacy .pyc and .pyo files.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
221 """
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
222 unload(modname)
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
223 for dirname in sys.path:
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
224 source = os.path.join(dirname, modname + '.py')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
225 # It doesn't matter if they exist or not, unlink all possible
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
226 # combinations of PEP 3147 and legacy pyc and pyo files.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
227 unlink(source + 'c')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
228 unlink(source + 'o')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
229 unlink(imp.cache_from_source(source, debug_override=True))
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
230 unlink(imp.cache_from_source(source, debug_override=False))
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231
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
232 def is_resource_enabled(resource):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
233 """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
234 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
235 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
236
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
237 def requires(resource, msg=None):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
238 """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
239
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
240 If the caller's module is __main__ then automatically return True. The
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
241 possibility of False being returned occurs when regrtest.py is
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
242 executing.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
243 """
28799
46d26afa8b95 if the test is run directly (__name__ == "__main__") don't actually require
Skip Montanaro <skip@pobox.com>
parents: 28174
diff changeset
244 # 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
245 # 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
246 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
247 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
248 if not is_resource_enabled(resource):
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
249 if msg is None:
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
250 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
251 raise ResourceDenied(msg)
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
252
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
253 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
254
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 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
256 """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
257 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
258 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
259 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
260 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
261 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
262
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 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
264 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
265 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
266 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
267 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
268 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
269 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
270 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
271 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
272 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
273 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
274 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
275 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
276 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
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 (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
279 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
280 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
281 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
282 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
283 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
284
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 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
286 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
287 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
288 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
289 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
290 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
291
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
292 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
293 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
294 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
295 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
296 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
297 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
298 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
299 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
300 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
301 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
302
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 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
304 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
305 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
306 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
307 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
308 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
309 """
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 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
312 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
313 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
314 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
315 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
316
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
317 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
318 """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
319 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
320 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
321 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
322 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
323 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
324 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
325 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
326
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
327 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
328 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
329 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
330 """
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
331
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
332 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
333 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
334 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
335 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
336 "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
337 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
338 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
339 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
340 "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
341 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
342 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
343
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
344 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
345 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
346 return port
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
347
1197
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
348 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
349
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
350 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
351 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
352 try:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
353 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
354 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
355 return 0
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
356 except:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
357 pass
39602
73a3291c58dc use isinstance instead of type. Use bool instead of int for flag.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39442
diff changeset
358 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
359 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
360 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
361 if outcome != 0:
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
362 return outcome
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39602
diff changeset
363 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
364 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
365
25982
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
366 is_jython = sys.platform.startswith('java')
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
367
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
368 # 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
369 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
370 # 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
371 TESTFN = '$test'
29066
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28968
diff changeset
372 else:
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
373 TESTFN = '@test'
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
374
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
375 # Disambiguate TESTFN for parallel testing, while letting it remain a valid
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
376 # module name.
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
377 TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
378
61226
d49f1310e23f Fix error handling removing files in test.support.unlink
Michael Foord <fuzzyman@voidspace.org.uk>
parents: 61163
diff changeset
379
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
380 # Assuming sys.getfilesystemencoding()!=sys.getdefaultencoding()
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
381 # TESTFN_UNICODE is a filename that can be encoded using the
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
382 # file system encoding, but *not* with the default (ascii) encoding
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
383 TESTFN_UNICODE = TESTFN + "-\xe0\xf2"
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
384 TESTFN_ENCODING = sys.getfilesystemencoding()
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
385
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
386 # TESTFN_UNENCODEABLE is a filename (str type) that should *not* be able to be
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
387 # encoded by the filesystem encoding (in strict mode). It can be None if we
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
388 # cannot generate such filename.
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
389 if os.name in ('nt', 'ce'):
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
390 if sys.getwindowsversion().platform < 2:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
391 # win32s (0) or Windows 9x/ME (1)
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
392 TESTFN_UNENCODEABLE = None
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
393 else:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
394 # Japanese characters (I think - from bug 846133)
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
395 TESTFN_UNENCODEABLE = TESTFN + "-\u5171\u6709\u3055\u308c\u308b"
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
396 try:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
397 TESTFN_UNENCODEABLE.encode(TESTFN_ENCODING)
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
398 except UnicodeEncodeError:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
399 pass
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
400 else:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
401 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
402 'Unicode filename tests may not be effective'
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
403 % (TESTFN_UNENCODEABLE, TESTFN_ENCODING))
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
404 TESTFN_UNENCODEABLE = None
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
405 else:
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
406 try:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
407 # ascii and utf-8 cannot encode the byte 0xff
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
408 b'\xff'.decode(TESTFN_ENCODING)
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
409 except UnicodeDecodeError:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
410 # 0xff will be encoded using the surrogate character u+DCFF
63948
aa89cbb7bc21 Oops, I did it again: add missing \ removed in previous commit
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63947
diff changeset
411 TESTFN_UNENCODEABLE = TESTFN \
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
412 + b'-\xff'.decode(TESTFN_ENCODING, 'surrogateescape')
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
413 else:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
414 # File system encoding (eg. ISO-8859-* encodings) can encode
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
415 # the byte 0xff. Skip some unicode filename tests.
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
416 TESTFN_UNENCODEABLE = None
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
417
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
418 # Save the initial cwd
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
419 SAVEDCWD = os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
420
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
421 @contextlib.contextmanager
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
422 def temp_cwd(name='tempcwd', quiet=False):
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
423 """
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
424 Context manager that creates a temporary directory and set it as CWD.
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
425
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
426 The new CWD is created in the current directory and it's named *name*.
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
427 If *quiet* is False (default) and it's not possible to create or change
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
428 the CWD, an error is raised. If it's True, only a warning is raised
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
429 and the original CWD is used.
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
430 """
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
431 saved_dir = os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
432 is_temporary = False
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
433 try:
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
434 os.mkdir(name)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
435 os.chdir(name)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
436 is_temporary = True
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
437 except OSError:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
438 if not quiet:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
439 raise
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
440 warnings.warn('tests may fail, unable to change the CWD to ' + name,
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
441 RuntimeWarning, stacklevel=3)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
442 try:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
443 yield os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
444 finally:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
445 os.chdir(saved_dir)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
446 if is_temporary:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
447 rmtree(name)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
448
17036
ad741745cb6c Oops. A RISCOS patch I forgot to check in.
Guido van Rossum <guido@python.org>
parents: 16723
diff changeset
449
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
450 @contextlib.contextmanager
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
451 def temp_umask(umask):
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
452 """Context manager that temporarily sets the process umask."""
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
453 oldmask = os.umask(umask)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
454 try:
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
455 yield
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
456 finally:
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
457 os.umask(oldmask)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
458
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
459
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59588
diff changeset
460 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
461 """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
462 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
463 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
464 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
465 return file
59601
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59588
diff changeset
466 if subdir is not None:
7a18c2762886 Merged revisions 78838-78839,78917,78919,78934,78937 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59588
diff changeset
467 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
468 path = sys.path
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
469 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
470 for dn in path:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
471 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
472 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
473 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
474
17815
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
475 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
476 "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
477 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
478 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
479 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
480 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
481
50915
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
482 def make_bad_fd():
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
483 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
484 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
485 its fd.
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
486 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
487 file = open(TESTFN, "wb")
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
488 try:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
489 return file.fileno()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
490 finally:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
491 file.close()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
492 unlink(TESTFN)
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
493
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39644
diff changeset
494 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
495 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
496 '<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
497
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
498 def open_urlresource(url, *args, **kw):
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
499 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
500
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
501 check = kw.pop('check', None)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
502
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
503 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
504
55303
1c57debf97bc Merged revisions 73930-73932,73937-73939,73945,73951,73954,73962-73963,73970 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55010
diff changeset
505 fn = os.path.join(os.path.dirname(__file__), "data", filename)
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
506
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
507 def check_valid_file(fn):
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
508 f = open(fn, *args, **kw)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
509 if check is None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
510 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
511 elif check(f):
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
512 f.seek(0)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
513 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
514 f.close()
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
515
55303
1c57debf97bc Merged revisions 73930-73932,73937-73939,73945,73951,73954,73962-73963,73970 via svnmerge from
Alexandre Vassalotti <alexandre@peadrop.com>
parents: 55010
diff changeset
516 if os.path.exists(fn):
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
517 f = check_valid_file(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
518 if f is not None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
519 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
520 unlink(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
521
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
522 # Verify the requirement before downloading the file
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
523 requires('urlfetch')
35998
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
524
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40742
diff changeset
525 print('\tfetching %s ...' % url, file=get_original_stdout())
57055
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
526 f = urllib.request.urlopen(url, timeout=15)
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
527 try:
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
528 with open(fn, "wb") as out:
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
529 s = f.read()
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
530 while s:
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
531 out.write(s)
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
532 s = f.read()
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
533 finally:
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
534 f.close()
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
535
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
536 f = check_valid_file(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
537 if f is not None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
538 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
539 raise TestFailed('invalid resource "%s"' % fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
540
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40587
diff changeset
541
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
542 class WarningsRecorder(object):
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
543 """Convenience wrapper for the warnings list returned on
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
544 entry to the warnings.catch_warnings() context manager.
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
545 """
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
546 def __init__(self, warnings_list):
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
547 self._warnings = warnings_list
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
548 self._last = 0
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
549
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
550 def __getattr__(self, attr):
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
551 if len(self._warnings) > self._last:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
552 return getattr(self._warnings[-1], attr)
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
553 elif attr in warnings.WarningMessage._WARNING_DETAILS:
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
554 return None
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
555 raise AttributeError("%r has no attribute %r" % (self, attr))
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
556
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
557 @property
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
558 def warnings(self):
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
559 return self._warnings[self._last:]
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
560
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
561 def reset(self):
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
562 self._last = len(self._warnings)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
563
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
564
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
565 def _filterwarnings(filters, quiet=False):
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
566 """Catch the warnings, then check if all the expected
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
567 warnings have been raised and re-raise unexpected warnings.
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
568 If 'quiet' is True, only re-raise the unexpected warnings.
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
569 """
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
570 # Clear the warning registry of the calling module
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
571 # in order to re-raise the warnings.
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
572 frame = sys._getframe(2)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
573 registry = frame.f_globals.get('__warningregistry__')
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
574 if registry:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
575 registry.clear()
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
576 with warnings.catch_warnings(record=True) as w:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
577 # Set filter "always" to record all warnings. Because
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
578 # test_warnings swap the module, we need to look up in
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
579 # the sys.modules dictionary.
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
580 sys.modules['warnings'].simplefilter("always")
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
581 yield WarningsRecorder(w)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
582 # Filter the recorded warnings
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
583 reraise = [warning.message for warning in w]
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
584 missing = []
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
585 for msg, cat in filters:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
586 seen = False
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
587 for exc in reraise[:]:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
588 message = str(exc)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
589 # Filter out the matching messages
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
590 if (re.match(msg, message, re.I) and
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
591 issubclass(exc.__class__, cat)):
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
592 seen = True
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
593 reraise.remove(exc)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
594 if not seen and not quiet:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
595 # This filter caught nothing
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
596 missing.append((msg, cat.__name__))
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
597 if reraise:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
598 raise AssertionError("unhandled warning %r" % reraise[0])
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
599 if missing:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
600 raise AssertionError("filter (%r, %s) did not catch any warning" %
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
601 missing[0])
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
602
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
603
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
604 @contextlib.contextmanager
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
605 def check_warnings(*filters, **kwargs):
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
606 """Context manager to silence warnings.
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
607
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
608 Accept 2-tuples as positional arguments:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
609 ("message regexp", WarningCategory)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
610
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
611 Optional argument:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
612 - if 'quiet' is True, it does not fail if a filter catches nothing
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
613 (default True without argument,
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
614 default False if some filters are defined)
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
615
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
616 Without argument, it defaults to:
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
617 check_warnings(("", Warning), quiet=True)
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
618 """
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
619 quiet = kwargs.get('quiet')
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
620 if not filters:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
621 filters = (("", Warning),)
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
622 # Preserve backward compatibility
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
623 if quiet is None:
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
624 quiet = True
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
625 return _filterwarnings(filters, quiet)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
626
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
627
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
628 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
629 """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
630
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
631 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
632 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
633
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
634 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
635
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
636 with CleanImport("foo"):
58684
fba1c78f104e Merged revisions 77956-77957 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents: 58476
diff changeset
637 importlib.import_module("foo") # new reference
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
638 """
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
639
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
640 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
641 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
642 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
643 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
644 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
645 # 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
646 # 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
647 # 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
648 # 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
649 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
650 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
651 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
652
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
653 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
654 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
655
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
656 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
657 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
658
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
659
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
660 class EnvironmentVarGuard(collections.MutableMapping):
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
661
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
662 """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
663 a context manager."""
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
664
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
665 def __init__(self):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
666 self._environ = os.environ
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
667 self._changed = {}
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
668
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
669 def __getitem__(self, envvar):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
670 return self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
671
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
672 def __setitem__(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
673 # 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
674 if envvar not in self._changed:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
675 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
676 self._environ[envvar] = value
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
677
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
678 def __delitem__(self, envvar):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
679 # 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
680 if envvar not in self._changed:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
681 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
682 if envvar in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
683 del self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
684
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
685 def keys(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
686 return self._environ.keys()
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
687
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
688 def __iter__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
689 return iter(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
690
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
691 def __len__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
692 return len(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
693
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
694 def set(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
695 self[envvar] = value
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
696
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
697 def unset(self, envvar):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
698 del self[envvar]
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
699
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
700 def __enter__(self):
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
701 return self
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
702
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
703 def __exit__(self, *ignore_exc):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
704 for (k, v) in self._changed.items():
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
705 if v is None:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
706 if k in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
707 del self._environ[k]
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
708 else:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
709 self._environ[k] = v
56592
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
710 os.environ = self._environ
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
711
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
712
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
713 class DirsOnSysPath(object):
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
714 """Context manager to temporarily add directories to sys.path.
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
715
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
716 This makes a copy of sys.path, appends any directories given
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
717 as positional arguments, then reverts sys.path to the copied
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
718 settings when the context ends.
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
719
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
720 Note that *all* sys.path modifications in the body of the
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
721 context manager, including replacement of the object,
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
722 will be reverted at the end of the block.
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
723 """
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
724
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
725 def __init__(self, *paths):
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
726 self.original_value = sys.path[:]
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
727 self.original_object = sys.path
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
728 sys.path.extend(paths)
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
729
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
730 def __enter__(self):
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
731 return self
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
732
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
733 def __exit__(self, *ignore_exc):
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
734 sys.path = self.original_object
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
735 sys.path[:] = self.original_value
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
736
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
737
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
738 class TransientResource(object):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
739
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
740 """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
741 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
742
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
743 def __init__(self, exc, **kwargs):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
744 self.exc = exc
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
745 self.attrs = kwargs
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
746
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
747 def __enter__(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
748 return self
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
749
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
750 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
751 """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
752 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
753 propagate (if any)."""
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
754 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
755 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
756 if not hasattr(value, attr):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
757 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
758 if getattr(value, attr) != attr_value:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
759 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
760 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
761 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
762
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
763
54553
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
764 # 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
765 # with the Internet connection manifest themselves as exceptions.
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
766 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
767 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
768 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
769
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
770
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
771 @contextlib.contextmanager
60817
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
772 def transient_internet():
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
773 """Return a context manager that raises ResourceDenied when various issues
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
774 with the Internet connection manifest themselves as exceptions."""
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
775 time_out = TransientResource(IOError, errno=errno.ETIMEDOUT)
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
776 socket_peer_reset = TransientResource(socket.error, errno=errno.ECONNRESET)
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
777 ioerror_peer_reset = TransientResource(IOError, errno=errno.ECONNRESET)
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
778 with time_out, socket_peer_reset, ioerror_peer_reset:
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
779 yield
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
780
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
781
f36a0ebeb163 Merged revisions 80314-80315 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60648
diff changeset
782 @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
783 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
784 """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
785 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
786 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
787
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
788 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
789 print("hello")
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
790 assert s.getvalue() == "hello"
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
791 """
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
792 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
793 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
794 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
795 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
796 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
797 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
798 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
799
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
800 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
801 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
802
56592
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
803 def captured_stdin():
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
804 return captured_output("stdin")
098ba3a63730 Note that a number of the changes listed below were not applicable to the Py3k branch, and hence the corresponding
Nick Coghlan <ncoghlan@gmail.com>
parents: 55393
diff changeset
805
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
806 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
807 """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
808
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
809 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
810 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
811 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
812 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
813 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
814 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
815 """
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
816 gc.collect()
60517
b4f60df31b14 Merged revisions 79934 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59720
diff changeset
817 if is_jython:
b4f60df31b14 Merged revisions 79934 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59720
diff changeset
818 time.sleep(0.1)
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
819 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
820 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
821
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
822
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
823 #=======================================================================
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
824 # 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
825 # 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
826
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
827 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
828 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
829 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
830 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
831 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
832 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
833 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
834 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
835 # 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
836 raise
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
837 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
838 # 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
839 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
840 else:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
841 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
842 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
843 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
844 break
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
845 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
846 pass
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
847
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
848 # 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
849 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
850 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
851 finally:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
852 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
853 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
854 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
855 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
856 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
857 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
858
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
859 #=======================================================================
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
860 # Big-memory-test support. Separate from 'resources' because memory use
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
861 # 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
862
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
863 # 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
864 # 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
865 _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
866 _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
867 _2G = 2 * _1G
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
868 _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
869
43100
4e6b4ba60c3b Remove the simple slicing API. All slicing is now done with slice objects.
Thomas Wouters <thomas@python.org>
parents: 43089
diff changeset
870 MAX_Py_ssize_t = sys.maxsize
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
871
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
872 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
873 global max_memuse
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
874 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
875 sizes = {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
876 '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
877 '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
878 '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
879 '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
880 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
881 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
882 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
883 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
884 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
885 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
886 real_max_memuse = memlimit
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
887 if memlimit > MAX_Py_ssize_t:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
888 memlimit = MAX_Py_ssize_t
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
889 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
890 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
891 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
892
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
893 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
894 """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
895
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
896 '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
897 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
898 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
899 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
900
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
901 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
902 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
903 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
904 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
905 """
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
906 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
907 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
908 # 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
909 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
910 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
911 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
912 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
913 # 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
914 # 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
915 # 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
916 # 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
917 maxsize = 5147
55010
f2b65bd67df2 remove use of failIf
Benjamin Peterson <benjamin@python.org>
parents: 54967
diff changeset
918 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
919 else:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
920 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
921 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
922 # 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
923 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
924 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
925 "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
926 return
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
927 # 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
928 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
929 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
930 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
931 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
932 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
933 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
934 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
935
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
936 def precisionbigmemtest(size, memuse, overhead=5*_1M):
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
937 def decorator(f):
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
938 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
939 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
940 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
941 overhead = wrapper.overhead
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
942 if not real_max_memuse:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
943 maxsize = 5147
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
944 else:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
945 maxsize = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
946
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
947 if real_max_memuse and real_max_memuse < maxsize * memuse:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
948 if verbose:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
949 sys.stderr.write("Skipping %s because of memory "
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
950 "constraint\n" % (f.__name__,))
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
951 return
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
952
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
953 return f(self, maxsize)
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
954 wrapper.size = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
955 wrapper.memuse = memuse
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
956 wrapper.overhead = overhead
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
957 return wrapper
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
958 return decorator
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
959
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
960 def bigaddrspacetest(f):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
961 """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
962 def wrapper(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
963 if max_memuse < MAX_Py_ssize_t:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
964 if verbose:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
965 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
966 "constraint\n" % (f.__name__,))
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
967 else:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
968 return f(self)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
969 return wrapper
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
970
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
971 #=======================================================================
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
972 # 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
973
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
974 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
975 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
976 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
977 test(result)
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
978 return result
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
979
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
980 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
981 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
982
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
983 def requires_resource(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
984 if resource_is_enabled(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
985 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
986 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
987 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
988
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
989 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
990 """
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
991 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
992 """
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
993 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
994
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
995 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
996 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
997 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
998 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
999 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
1000 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
1001 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
1002 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
1003 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
1004 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
1005 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
1006 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
1007
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
1008 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
1009 # 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
1010 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
1011 return ({'cpython': True}, False)
53487
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
1012 is_true = list(guards.values())[0]
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
1013 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
1014 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
1015
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
1016 # 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
1017 # 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
1018 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
1019 """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
1020 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
1021 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
1022 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
1023 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
1024 """
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
1025 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
1026 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
1027
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
1028
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1029
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1030 def _run_suite(suite):
19995
b07cb51d731c run_suite(): Oops, update a docstring.
Barry Warsaw <barry@python.org>
parents: 19994
diff changeset
1031 """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
1032 if verbose:
61163
cf0361c02551 Issue #8533: revert r80694; try a different fix: regrtest uses backslashreplace
Victor Stinner <victor.stinner@haypocalc.com>
parents: 61154
diff changeset
1033 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
1034 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
1035 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
1036
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
1037 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
1038 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
1039 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
1040 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
1041 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
1042 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
1043 else:
56627
5541e42e1c81 Merged revisions 75528 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 56592
diff changeset
1044 err = "multiple errors occurred"
5541e42e1c81 Merged revisions 75528 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 56592
diff changeset
1045 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
1046 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
1047
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
1048
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1049 def run_unittest(*classes):
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1050 """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
1051 valid_types = (unittest.TestSuite, unittest.TestCase)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
1052 suite = unittest.TestSuite()
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1053 for cls in classes:
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43100
diff changeset
1054 if isinstance(cls, str):
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1055 if cls in sys.modules:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1056 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
1057 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1058 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
1059 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
1060 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
1061 else:
3f214b39b4df run_unittest() to support TestCase instances as well as classes. Helps with doctests.
Raymond Hettinger <python@rcn.com>
parents: 29142
diff changeset
1062 suite.addTest(unittest.makeSuite(cls))
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1063 _run_suite(suite)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
1064
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
1065
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
1066 #=======================================================================
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
1067 # 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
1068
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
1069 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
1070 """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
1071
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
1072 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
1073 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
1074 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
1075 """
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
1076
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
1077 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
1078
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
1079 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
1080 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
1081 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
1082 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
1083
20088
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
1084 # 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
1085 # 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
1086 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
1087 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
1088 try:
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
1089 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
1090 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
1091 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
1092 finally:
386fb26e0874 Get rid of the increasingly convoluted global tricks w/ sys.stdout, in
Tim Peters <tim.peters@gmail.com>
parents: 20083
diff changeset
1093 sys.stdout = save_stdout
29140
e57e22aa56a4 Provide a clue that the doctests have run.
Raymond Hettinger <python@rcn.com>
parents: 29066
diff changeset
1094 if verbose:
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1095 print('doctest (%s) ... %d tests with zero failures' %
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1096 (module.__name__, t))
29140
e57e22aa56a4 Provide a clue that the doctests have run.
Raymond Hettinger <python@rcn.com>
parents: 29066
diff changeset
1097 return f, t
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1098
57214
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1099
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1100 #=======================================================================
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1101 # Support for saving and restoring the imported modules.
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1102
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1103 def modules_setup():
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1104 return sys.modules.copy(),
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1105
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1106 def modules_cleanup(oldmodules):
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1107 # Encoders/decoders are registered permanently within the internal
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1108 # codec cache. If we destroy the corresponding modules their
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1109 # globals will be set to None which will trip up the cached functions.
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1110 encodings = [(k, v) for k, v in sys.modules.items()
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1111 if k.startswith('encodings.')]
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1112 sys.modules.clear()
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1113 sys.modules.update(encodings)
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1114 sys.modules.update(oldmodules)
685527ae437d Issue #6551: test_zipimport could import and then destroy some modules of
Antoine Pitrou <solipsis@pitrou.net>
parents: 57055
diff changeset
1115
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1116 #=======================================================================
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1117 # 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
1118
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1119 # NOTE: we use thread._count() rather than threading.enumerate() (or the
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1120 # moral equivalent thereof) because a threading.Thread object is still alive
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1121 # until its __bootstrap() method has returned, even after it has been
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1122 # unregistered from the threading module.
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1123 # thread._count(), on the other hand, only gets decremented *after* the
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1124 # __bootstrap() method has returned, which gives us reliable reference counts
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1125 # at the end of a test run.
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1126
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1127 def threading_setup():
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1128 if _thread:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1129 return _thread._count(),
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1130 else:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1131 return 1,
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1132
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1133 def threading_cleanup(nb_threads):
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1134 if not _thread:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1135 return
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1136 _MAX_COUNT = 10
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1137 for count in range(_MAX_COUNT):
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1138 n = _thread._count()
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1139 if n == nb_threads:
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1140 break
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1141 time.sleep(0.1)
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1142 # XXX print a warning in case of failure?
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1143
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
1144 def reap_threads(func):
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1145 """Use this function when threads are being used. This will
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1146 ensure that the threads are cleaned up even when the test fails.
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1147 If threading is unavailable this function does nothing.
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1148 """
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1149 if not _thread:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1150 return func
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1151
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
1152 @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
1153 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
1154 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
1155 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
1156 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
1157 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
1158 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
1159 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
1160
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1161 def reap_children():
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1162 """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
1163 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
1164 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
1165 for refleaks.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1166 """
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1167
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1168 # 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
1169 # 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
1170 if hasattr(os, 'waitpid'):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1171 any_process = -1
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1172 while True:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1173 try:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1174 # 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
1175 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
1176 if pid == 0:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1177 break
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1178 except:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1179 break
59654
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1180
62874
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1181 try:
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1182 from .symlink_support import enable_symlink_privilege
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1183 except:
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1184 enable_symlink_privilege = lambda: True
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1185
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1186 def can_symlink():
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1187 """It's no longer sufficient to test for the presence of symlink in the
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1188 os module - on Windows XP and earlier, os.symlink exists but a
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1189 NotImplementedError is thrown.
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1190 """
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1191 has_symlink = hasattr(os, 'symlink')
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1192 is_old_windows = sys.platform == "win32" and sys.getwindowsversion().major < 6
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1193 has_privilege = False if is_old_windows else enable_symlink_privilege()
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1194 return has_symlink and (not is_old_windows) and has_privilege
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1195
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1196 def skip_unless_symlink(test):
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1197 """Skip decorator for tests that require functional symlink"""
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1198 selector = can_symlink()
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1199 msg = "Requires functional symlink implementation"
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1200 return [unittest.skip(msg)(test), test][selector]
730b728e5aef Implement #1578269. Patch by Jason R. Coombs.
Brian Curtin <brian.curtin@gmail.com>
parents: 61226
diff changeset
1201
59654
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1202 @contextlib.contextmanager
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1203 def swap_attr(obj, attr, new_val):
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1204 """Temporary swap out an attribute with a new object.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1205
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1206 Usage:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1207 with swap_attr(obj, "attr", 5):
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1208 ...
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1209
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1210 This will set obj.attr to 5 for the duration of the with: block,
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1211 restoring the old value at the end of the block. If `attr` doesn't
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1212 exist on `obj`, it will be created and then deleted at the end of the
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1213 block.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1214 """
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1215 if hasattr(obj, attr):
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1216 real_val = getattr(obj, attr)
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1217 setattr(obj, attr, new_val)
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1218 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1219 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1220 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1221 setattr(obj, attr, real_val)
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1222 else:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1223 setattr(obj, attr, new_val)
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1224 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1225 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1226 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1227 delattr(obj, attr)
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1228
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1229 @contextlib.contextmanager
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1230 def swap_item(obj, item, new_val):
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1231 """Temporary swap out an item with a new object.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1232
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1233 Usage:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1234 with swap_item(obj, "item", 5):
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1235 ...
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1236
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1237 This will set obj["item"] to 5 for the duration of the with: block,
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1238 restoring the old value at the end of the block. If `item` doesn't
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1239 exist on `obj`, it will be created and then deleted at the end of the
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1240 block.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1241 """
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1242 if item in obj:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1243 real_val = obj[item]
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1244 obj[item] = new_val
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1245 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1246 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1247 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1248 obj[item] = real_val
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1249 else:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1250 obj[item] = new_val
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1251 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1252 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1253 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1254 del obj[item]
63727
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1255
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1256 def strip_python_stderr(stderr):
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1257 """Strip the stderr of a Python process from potential debug output
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1258 emitted by the interpreter.
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1259
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1260 This will typically be run on the result of the communicate() method
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1261 of a subprocess.Popen object.
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1262 """
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1263 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
5931112eabe7 Factor out stripping of interpreter debug output in test.support.strip_python_stderr()
Antoine Pitrou <solipsis@pitrou.net>
parents: 62998
diff changeset
1264 return stderr