annotate Lib/test/support.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents f23222d734bd
children efade142ef01 56becb6716fd
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
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
23 import sysconfig
71612
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
24 import fnmatch
66816
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
25 import logging.handlers
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
26
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
27 try:
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
28 import _thread, threading
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
29 except ImportError:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
30 _thread = None
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
31 threading = None
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
32 try:
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
33 import multiprocessing.process
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
34 except ImportError:
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
35 multiprocessing = None
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
36
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
37
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
38 __all__ = [
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
39 "Error", "TestFailed", "ResourceDenied", "import_module",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
40 "verbose", "use_resources", "max_memuse", "record_original_stdout",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
41 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
70575
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
42 "is_resource_enabled", "requires", "requires_mac_ver",
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
43 "find_unused_port", "bind_port",
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
44 "fcmp", "is_jython", "TESTFN", "HOST", "FUZZ", "SAVEDCWD", "temp_cwd",
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
45 "findfile", "sortdict", "check_syntax_error", "open_urlresource",
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
46 "check_warnings", "CleanImport", "EnvironmentVarGuard",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
47 "TransientResource", "captured_output", "captured_stdout",
70097
b2bcddfb8b18 Update __all__ and docstring.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70090
diff changeset
48 "captured_stdin", "captured_stderr",
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
49 "time_out", "socket_peer_reset", "ioerror_peer_reset",
64533
91c7f44e4bea Issue #8574: better implementation of test.support.transient_internet().
Antoine Pitrou <solipsis@pitrou.net>
parents: 64194
diff changeset
50 "run_with_locale", 'temp_umask', "transient_internet",
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
51 "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
52 "run_unittest", "run_doctest", "threading_setup", "threading_cleanup",
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
53 "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
66816
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
54 "swap_item", "swap_attr", "requires_IEEE_754",
69943
ae6cd69ce9f8 merge 3.1
Benjamin Peterson <benjamin@python.org>
parents: 69676 69942
diff changeset
55 "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
76644
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
56 "import_fresh_module", "failfast", "run_with_tz"
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
57 ]
47317
ba8015e23487 Merged revisions 63698 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
58
13682
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
59 class Error(Exception):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
60 """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
61
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
62 class TestFailed(Error):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
63 """Test failed."""
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
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
65 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
66 """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
67
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
68 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
69 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
70 and unexpected skips.
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
71 """
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
72
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
73 @contextlib.contextmanager
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
74 def _ignore_deprecated_imports(ignore=True):
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
75 """Context manager to suppress package and module deprecation
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
76 warnings when importing them.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
77
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
78 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
79 if ignore:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
80 with warnings.catch_warnings():
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
81 warnings.filterwarnings("ignore", ".+ (module|package)",
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
82 DeprecationWarning)
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
83 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
84 else:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
85 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
86
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
87
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
88 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
89 """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
90 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
91
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
92 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
93 will be suppressed."""
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
94 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
95 try:
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
96 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
97 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
98 raise unittest.SkipTest(str(msg))
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
99
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
100
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
101 def _save_and_remove_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
102 """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
103
69955
3ab1eb027856 #11910: change import_fresh_module to return None when one of the "fresh" modules can not be imported.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69942
diff changeset
104 Raise ImportError if the module can't be imported."""
70081
9b7bfe86f04d Change import_fresh_module to work with packages.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69955
diff changeset
105 # try to import the module and raise an error if it can't be imported
9b7bfe86f04d Change import_fresh_module to work with packages.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69955
diff changeset
106 if name not in sys.modules:
69955
3ab1eb027856 #11910: change import_fresh_module to return None when one of the "fresh" modules can not be imported.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69942
diff changeset
107 __import__(name)
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
108 del sys.modules[name]
70081
9b7bfe86f04d Change import_fresh_module to work with packages.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69955
diff changeset
109 for modname in list(sys.modules):
9b7bfe86f04d Change import_fresh_module to work with packages.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69955
diff changeset
110 if modname == name or modname.startswith(name + '.'):
9b7bfe86f04d Change import_fresh_module to work with packages.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69955
diff changeset
111 orig_modules[modname] = sys.modules[modname]
9b7bfe86f04d Change import_fresh_module to work with packages.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69955
diff changeset
112 del sys.modules[modname]
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
113
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
114 def _save_and_block_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
115 """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
116
69955
3ab1eb027856 #11910: change import_fresh_module to return None when one of the "fresh" modules can not be imported.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69942
diff changeset
117 Return True if the module was in sys.modules, False otherwise."""
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
118 saved = True
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
119 try:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
120 orig_modules[name] = sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
121 except KeyError:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
122 saved = False
62999
daea978a48ae Merged revisions 82850 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61581
diff changeset
123 sys.modules[name] = None
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
124 return saved
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
125
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
126
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
127 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
128 """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
129 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
130 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
131
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
132 Modules named in fresh are also imported anew if needed by the import.
69955
3ab1eb027856 #11910: change import_fresh_module to return None when one of the "fresh" modules can not be imported.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69942
diff changeset
133 If one of these modules can't be imported, None is returned.
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
134
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
135 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
136 takes place.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
137
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
138 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
139 will be suppressed."""
70085
c2853a54b29e #5723: Improve json tests to be executed with and without accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70081
diff changeset
140 # NOTE: test_heapq, test_json and test_warnings include extra sanity checks
c2853a54b29e #5723: Improve json tests to be executed with and without accelerations.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70081
diff changeset
141 # to make sure that this utility function is working as expected
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
142 with _ignore_deprecated_imports(deprecated):
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
143 # 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
144 # 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
145 orig_modules = {}
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
146 names_to_remove = []
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
147 _save_and_remove_module(name, orig_modules)
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
148 try:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
149 for fresh_name in fresh:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
150 _save_and_remove_module(fresh_name, orig_modules)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
151 for blocked_name in blocked:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
152 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
153 names_to_remove.append(blocked_name)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
154 fresh_module = importlib.import_module(name)
69955
3ab1eb027856 #11910: change import_fresh_module to return None when one of the "fresh" modules can not be imported.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69942
diff changeset
155 except ImportError:
3ab1eb027856 #11910: change import_fresh_module to return None when one of the "fresh" modules can not be imported.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69942
diff changeset
156 fresh_module = None
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
157 finally:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
158 for orig_name, module in orig_modules.items():
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
159 sys.modules[orig_name] = module
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
160 for name_to_remove in names_to_remove:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
161 del sys.modules[name_to_remove]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
162 return fresh_module
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
163
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
164
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
165 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
166 """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
167 try:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
168 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
169 except AttributeError:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
170 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
171 obj.__name__, name))
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
172 else:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
173 return attribute
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
174
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
175 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
176 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
177 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
178 # small sizes, to make sure they work.)
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
179 real_max_memuse = 0
71487
9f847dfba217 Issue #12624: It is now possible to fail after the first failure when
Antoine Pitrou <solipsis@pitrou.net>
parents: 71365
diff changeset
180 failfast = False
71612
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
181 match_tests = None
4791
a2fd80eed27f Add verbose flag for regression test to clear.
Guido van Rossum <guido@python.org>
parents: 1197
diff changeset
182
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
183 # _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
184 # 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
185 # 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
186 _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
187 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
188 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
189 _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
190
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
191 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
192 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
193
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 def unload(name):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
195 try:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
196 del sys.modules[name]
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
197 except KeyError:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
198 pass
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
200 def unlink(filename):
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
201 try:
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
202 os.unlink(filename)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
203 except OSError as error:
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
204 # 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
205 if error.errno not in (errno.ENOENT, errno.ENOTDIR):
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
206 raise
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
207
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
208 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
209 try:
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
210 shutil.rmtree(path)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
211 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
212 # Unix returns ENOENT, Windows returns ESRCH.
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
213 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
214 raise
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
215
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
216 def make_legacy_pyc(source):
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
217 """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
218
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
219 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
220 value.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
221
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
222 :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
223 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
224 :return: The file system path to the legacy pyc file.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
225 """
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
226 pyc_file = imp.cache_from_source(source)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
227 up_one = os.path.dirname(os.path.abspath(source))
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
228 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
229 os.rename(pyc_file, legacy_pyc)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
230 return legacy_pyc
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
231
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 def forget(modname):
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
233 """'Forget' a module was ever imported.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
234
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
235 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
236 legacy .pyc and .pyo files.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
237 """
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
238 unload(modname)
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
239 for dirname in sys.path:
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
240 source = os.path.join(dirname, modname + '.py')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
241 # It doesn't matter if they exist or not, unlink all possible
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
242 # combinations of PEP 3147 and legacy pyc and pyo files.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
243 unlink(source + 'c')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
244 unlink(source + 'o')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
245 unlink(imp.cache_from_source(source, debug_override=True))
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
246 unlink(imp.cache_from_source(source, debug_override=False))
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
248 # On some platforms, should not run gui test even if it is allowed
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
249 # in `use_resources'.
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
250 if sys.platform.startswith('win'):
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
251 import ctypes
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
252 import ctypes.wintypes
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
253 def _is_gui_available():
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
254 UOI_FLAGS = 1
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
255 WSF_VISIBLE = 0x0001
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
256 class USEROBJECTFLAGS(ctypes.Structure):
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
257 _fields_ = [("fInherit", ctypes.wintypes.BOOL),
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
258 ("fReserved", ctypes.wintypes.BOOL),
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
259 ("dwFlags", ctypes.wintypes.DWORD)]
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
260 dll = ctypes.windll.user32
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
261 h = dll.GetProcessWindowStation()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
262 if not h:
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
263 raise ctypes.WinError()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
264 uof = USEROBJECTFLAGS()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
265 needed = ctypes.wintypes.DWORD()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
266 res = dll.GetUserObjectInformationW(h,
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
267 UOI_FLAGS,
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
268 ctypes.byref(uof),
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
269 ctypes.sizeof(uof),
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
270 ctypes.byref(needed))
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
271 if not res:
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
272 raise ctypes.WinError()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
273 return bool(uof.dwFlags & WSF_VISIBLE)
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
274 else:
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
275 def _is_gui_available():
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
276 return True
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
277
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
278 def is_resource_enabled(resource):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
279 """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
280 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
281 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
282
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
283 def requires(resource, msg=None):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
284 """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
285
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
286 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
287 possibility of False being returned occurs when regrtest.py is
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
288 executing.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
289 """
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
290 if resource == 'gui' and not _is_gui_available():
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
291 raise unittest.SkipTest("Cannot use the 'gui' resource")
28799
46d26afa8b95 if the test is run directly (__name__ == "__main__") don't actually require
Skip Montanaro <skip@pobox.com>
parents: 28174
diff changeset
292 # 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
293 # 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
294 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
295 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
296 if not is_resource_enabled(resource):
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
297 if msg is None:
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
298 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
299 raise ResourceDenied(msg)
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
300
70575
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
301 def requires_mac_ver(*min_version):
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
302 """Decorator raising SkipTest if the OS is Mac OS X and the OS X
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
303 version if less than min_version.
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
304
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
305 For example, @requires_mac_ver(10, 5) raises SkipTest if the OS X version
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
306 is lesser than 10.5.
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
307 """
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
308 def decorator(func):
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
309 @functools.wraps(func)
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
310 def wrapper(*args, **kw):
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
311 if sys.platform == 'darwin':
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
312 version_txt = platform.mac_ver()[0]
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
313 try:
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
314 version = tuple(map(int, version_txt.split('.')))
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
315 except ValueError:
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
316 pass
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
317 else:
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
318 if version < min_version:
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
319 min_version_txt = '.'.join(map(str, min_version))
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
320 raise unittest.SkipTest(
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
321 "Mac OS X %s or higher required, not %s"
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
322 % (min_version_txt, version_txt))
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
323 return func(*args, **kw)
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
324 wrapper.min_version = min_version
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
325 return wrapper
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
326 return decorator
22457ac2c2df Close #12230: Mac OS X Tiger (10.4) has a kernel bug: sometimes, the file
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70097
diff changeset
327
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
328 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
329
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 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
331 """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
332 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
333 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
334 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
335 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
336 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
337
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 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
339 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
340 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
341 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
342 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
343 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
344 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
345 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
346 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
347 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
348 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
349 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
350 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
351 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
352
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
353 (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
354 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
355 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
356 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
357 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
358 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
359
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
360 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
361 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
362 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
363 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
364 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
365 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
366
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
367 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
368 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
369 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
370 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
371 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
372 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
373 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
374 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
375 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
376 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
377
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
378 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
379 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
380 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
381 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
382 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
383 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
384 """
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
385
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
386 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
387 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
388 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
389 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
390 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
391
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
392 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
393 """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
394 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
395 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
396 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
397 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
398 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
399 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
400 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
401
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
402 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
403 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
404 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
405 """
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
406
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
407 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
408 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
409 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
410 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
411 "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
412 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
413 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
414 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
415 "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
416 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
417 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
418
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
419 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
420 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
421 return port
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
422
1197
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
423 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
424
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
425 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
426 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
427 try:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
428 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
429 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
430 return 0
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
431 except:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
432 pass
39602
73a3291c58dc use isinstance instead of type. Use bool instead of int for flag.
Neal Norwitz <nnorwitz@gmail.com>
parents: 39442
diff changeset
433 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
434 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
435 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
436 if outcome != 0:
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
437 return outcome
39644
13d5e5f0e993 Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents: 39602
diff changeset
438 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
439 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
440
66706
ae3fa781eef2 Issue #10624: Move requires_IEEE_754 into test.support. I'll fix up other uses of it shortly.
Eric Smith <eric@trueblade.com>
parents: 66606
diff changeset
441 # decorator for skipping tests on non-IEEE 754 platforms
ae3fa781eef2 Issue #10624: Move requires_IEEE_754 into test.support. I'll fix up other uses of it shortly.
Eric Smith <eric@trueblade.com>
parents: 66606
diff changeset
442 requires_IEEE_754 = unittest.skipUnless(
ae3fa781eef2 Issue #10624: Move requires_IEEE_754 into test.support. I'll fix up other uses of it shortly.
Eric Smith <eric@trueblade.com>
parents: 66606
diff changeset
443 float.__getformat__("double").startswith("IEEE"),
ae3fa781eef2 Issue #10624: Move requires_IEEE_754 into test.support. I'll fix up other uses of it shortly.
Eric Smith <eric@trueblade.com>
parents: 66606
diff changeset
444 "test requires IEEE 754 doubles")
ae3fa781eef2 Issue #10624: Move requires_IEEE_754 into test.support. I'll fix up other uses of it shortly.
Eric Smith <eric@trueblade.com>
parents: 66606
diff changeset
445
25982
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
446 is_jython = sys.platform.startswith('java')
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
447
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
448 # 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
449 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
450 # 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
451 TESTFN = '$test'
29066
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28968
diff changeset
452 else:
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
453 TESTFN = '@test'
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
454
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
455 # 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
456 # module name.
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
457 TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
458
61226
d49f1310e23f Fix error handling removing files in test.support.unlink
Michael Foord <fuzzyman@voidspace.org.uk>
parents: 61163
diff changeset
459
64139
0ed76c7b9847 Improve PEP 383 tests (in test_os)
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64110
diff changeset
460 # TESTFN_UNICODE is a non-ascii filename
0ed76c7b9847 Improve PEP 383 tests (in test_os)
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64110
diff changeset
461 TESTFN_UNICODE = TESTFN + "-\xe0\xf2\u0258\u0141\u011f"
64149
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
462 if sys.platform == 'darwin':
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
463 # In Mac OS X's VFS API file names are, by definition, canonically
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
464 # decomposed Unicode, encoded using UTF-8. See QA1173:
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
465 # http://developer.apple.com/mac/library/qa/qa2001/qa1173.html
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
466 import unicodedata
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
467 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
468 TESTFN_ENCODING = sys.getfilesystemencoding()
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
469
63960
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
470 # TESTFN_UNENCODABLE is a filename (str type) that should *not* be able to be
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
471 # 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
472 # cannot generate such filename.
64050
673c4e8a01c4 Fix TESTFN_UNENCODABLE of test.support on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64008
diff changeset
473 TESTFN_UNENCODABLE = None
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
474 if os.name in ('nt', 'ce'):
64050
673c4e8a01c4 Fix TESTFN_UNENCODABLE of test.support on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64008
diff changeset
475 # skip win32s (0) or Windows 9x/ME (1)
673c4e8a01c4 Fix TESTFN_UNENCODABLE of test.support on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64008
diff changeset
476 if sys.getwindowsversion().platform >= 2:
64603
c20de96a435a Merged revisions 84666 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64541
diff changeset
477 # Different kinds of characters from various languages to minimize the
c20de96a435a Merged revisions 84666 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64541
diff changeset
478 # probability that the whole name is encodable to MBCS (issue #9819)
c20de96a435a Merged revisions 84666 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64541
diff changeset
479 TESTFN_UNENCODABLE = TESTFN + "-\u5171\u0141\u2661\u0363\uDC80"
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
480 try:
63960
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
481 TESTFN_UNENCODABLE.encode(TESTFN_ENCODING)
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
482 except UnicodeEncodeError:
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
483 pass
26139
144d9d48b96c Don't try to convert the test filename to Unicode with -U.
Martin v. Löwis <martin@v.loewis.de>
parents: 26128
diff changeset
484 else:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
485 print('WARNING: The filename %r CAN be encoded by the filesystem encoding (%s). '
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
486 'Unicode filename tests may not be effective'
63960
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
487 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
488 TESTFN_UNENCODABLE = None
64050
673c4e8a01c4 Fix TESTFN_UNENCODABLE of test.support on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64008
diff changeset
489 # Mac OS X denies unencodable filenames (invalid utf-8)
64008
c68f271342d0 Mac OS X denies unencodable filenames (invalid utf-8)
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63960
diff changeset
490 elif sys.platform != 'darwin':
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
491 try:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
492 # 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
493 b'\xff'.decode(TESTFN_ENCODING)
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
494 except UnicodeDecodeError:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
495 # 0xff will be encoded using the surrogate character u+DCFF
63960
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
496 TESTFN_UNENCODABLE = TESTFN \
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
497 + 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
498 else:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
499 # 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
500 # the byte 0xff. Skip some unicode filename tests.
64050
673c4e8a01c4 Fix TESTFN_UNENCODABLE of test.support on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64008
diff changeset
501 pass
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
502
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
503 # Save the initial cwd
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
504 SAVEDCWD = os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
505
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
506 @contextlib.contextmanager
64110
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
507 def temp_cwd(name='tempcwd', quiet=False, path=None):
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
508 """
64110
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
509 Context manager that temporarily changes the CWD.
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
510
64110
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
511 An existing path may be provided as *path*, in which case this
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
512 function makes no changes to the file system.
61581
2369d4f189e4 test/support.py: remove TESTFN if it is a directory
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60818
diff changeset
513
64110
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
514 Otherwise, the new CWD is created in the current directory and it's
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
515 named *name*. If *quiet* is False (default) and it's not possible to
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
516 create or change the CWD, an error is raised. If it's True, only a
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
517 warning is raised and the original CWD is used.
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
518 """
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
519 saved_dir = os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
520 is_temporary = False
64110
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
521 if path is None:
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
522 path = name
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
523 try:
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
524 os.mkdir(name)
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
525 is_temporary = True
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
526 except OSError:
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
527 if not quiet:
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
528 raise
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
529 warnings.warn('tests may fail, unable to create temp CWD ' + name,
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
530 RuntimeWarning, stacklevel=3)
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
531 try:
64110
212a16f906a6 Issue #8202: Set sys.argv[0] to -m rather than -c while searching for the module to execute. Also updates all the cmd_line_script tests to validate the setting of sys.path[0] and the current working directory
Nick Coghlan <ncoghlan@gmail.com>
parents: 64050
diff changeset
532 os.chdir(path)
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
533 except OSError:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
534 if not quiet:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
535 raise
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
536 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
537 RuntimeWarning, stacklevel=3)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
538 try:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
539 yield os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
540 finally:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
541 os.chdir(saved_dir)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
542 if is_temporary:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
543 rmtree(name)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
544
17036
ad741745cb6c Oops. A RISCOS patch I forgot to check in.
Guido van Rossum <guido@python.org>
parents: 16723
diff changeset
545
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
546 @contextlib.contextmanager
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
547 def temp_umask(umask):
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
548 """Context manager that temporarily sets the process umask."""
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
549 oldmask = os.umask(umask)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
550 try:
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
551 yield
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
552 finally:
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
553 os.umask(oldmask)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
554
17036
ad741745cb6c Oops. A RISCOS patch I forgot to check in.
Guido van Rossum <guido@python.org>
parents: 16723
diff changeset
555
63005
ef67e7481244 Partial port of r78919 from trunk: add subdir argument to the findfile helper
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62999
diff changeset
556 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
557 """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
558 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
559 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
560 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
561 return file
63005
ef67e7481244 Partial port of r78919 from trunk: add subdir argument to the findfile helper
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62999
diff changeset
562 if subdir is not None:
ef67e7481244 Partial port of r78919 from trunk: add subdir argument to the findfile helper
Victor Stinner <victor.stinner@haypocalc.com>
parents: 62999
diff changeset
563 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
564 path = sys.path
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
565 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
566 for dn in path:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
567 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
568 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
569 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
570
17815
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
571 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
572 "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
573 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
574 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
575 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
576 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
577
50915
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
578 def make_bad_fd():
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
579 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
580 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
581 its fd.
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
582 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
583 file = open(TESTFN, "wb")
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
584 try:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
585 return file.fileno()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
586 finally:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
587 file.close()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
588 unlink(TESTFN)
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
589
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39644
diff changeset
590 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
591 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
592 '<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
593
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
594 def open_urlresource(url, *args, **kw):
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
595 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
596
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
597 check = kw.pop('check', None)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
598
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
599 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
600
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
601 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
602
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
603 def check_valid_file(fn):
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
604 f = open(fn, *args, **kw)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
605 if check is None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
606 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
607 elif check(f):
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
608 f.seek(0)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
609 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
610 f.close()
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
611
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
612 if os.path.exists(fn):
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
613 f = check_valid_file(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
614 if f is not None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
615 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
616 unlink(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
617
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
618 # 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
619 requires('urlfetch')
35998
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
620
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40742
diff changeset
621 print('\tfetching %s ...' % url, file=get_original_stdout())
57056
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
622 f = urllib.request.urlopen(url, timeout=15)
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
623 try:
57055
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
624 with open(fn, "wb") as out:
57056
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
625 s = f.read()
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
626 while s:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
627 out.write(s)
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
628 s = f.read()
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
629 finally:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
630 f.close()
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
631
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
632 f = check_valid_file(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
633 if f is not None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
634 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
635 raise TestFailed('invalid resource "%s"' % fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
636
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
637
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
638 class WarningsRecorder(object):
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
639 """Convenience wrapper for the warnings list returned on
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
640 entry to the warnings.catch_warnings() context manager.
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
641 """
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
642 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
643 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
644 self._last = 0
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
645
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
646 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
647 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
648 return getattr(self._warnings[-1], attr)
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
649 elif attr in warnings.WarningMessage._WARNING_DETAILS:
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
650 return None
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
651 raise AttributeError("%r has no attribute %r" % (self, attr))
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
652
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
653 @property
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
654 def warnings(self):
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
655 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
656
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
657 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
658 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
659
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
660
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
661 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
662 """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
663 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
664 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
665 """
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
666 # 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
667 # 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
668 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
669 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
670 if registry:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
671 registry.clear()
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
672 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
673 # 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
674 # 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
675 # 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
676 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
677 yield WarningsRecorder(w)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
678 # Filter the recorded warnings
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
679 reraise = list(w)
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
680 missing = []
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
681 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
682 seen = False
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
683 for w in reraise[:]:
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
684 warning = w.message
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
685 # Filter out the matching messages
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
686 if (re.match(msg, str(warning), re.I) and
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
687 issubclass(warning.__class__, cat)):
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
688 seen = True
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
689 reraise.remove(w)
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
690 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
691 # 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
692 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
693 if reraise:
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
694 raise AssertionError("unhandled warning %s" % reraise[0])
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
695 if missing:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
696 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
697 missing[0])
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
698
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
699
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
700 @contextlib.contextmanager
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
701 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
702 """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
703
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
704 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
705 ("message regexp", WarningCategory)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
706
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
707 Optional argument:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
708 - 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
709 (default True without argument,
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
710 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
711
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
712 Without argument, it defaults to:
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
713 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
714 """
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
715 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
716 if not filters:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
717 filters = (("", Warning),)
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
718 # Preserve backward compatibility
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
719 if quiet is None:
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
720 quiet = True
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
721 return _filterwarnings(filters, quiet)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
722
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
723
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
724 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
725 """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
726
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
727 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
728 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
729
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
730 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
731
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
732 with CleanImport("foo"):
58684
fba1c78f104e Merged revisions 77956-77957 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents: 58476
diff changeset
733 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
734 """
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
735
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
736 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
737 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
738 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
739 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
740 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
741 # 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
742 # 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
743 # 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
744 # 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
745 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
746 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
747 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
748
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
749 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
750 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
751
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
752 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
753 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
754
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
755
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
756 class EnvironmentVarGuard(collections.MutableMapping):
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
757
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
758 """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
759 a context manager."""
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
760
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
761 def __init__(self):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
762 self._environ = os.environ
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
763 self._changed = {}
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
764
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
765 def __getitem__(self, envvar):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
766 return self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
767
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
768 def __setitem__(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
769 # 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
770 if envvar not in self._changed:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
771 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
772 self._environ[envvar] = value
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
773
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
774 def __delitem__(self, envvar):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
775 # 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
776 if envvar not in self._changed:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
777 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
778 if envvar in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
779 del self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
780
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
781 def keys(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
782 return self._environ.keys()
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
783
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
784 def __iter__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
785 return iter(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
786
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
787 def __len__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
788 return len(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
789
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
790 def set(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
791 self[envvar] = value
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
792
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
793 def unset(self, envvar):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
794 del self[envvar]
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
795
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
796 def __enter__(self):
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
797 return self
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
798
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
799 def __exit__(self, *ignore_exc):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
800 for (k, v) in self._changed.items():
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
801 if v is None:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
802 if k in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
803 del self._environ[k]
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
804 else:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
805 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
806 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
807
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
808
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
809 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
810 """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
811
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
812 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
813 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
814 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
815
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
816 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
817 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
818 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
819 """
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
820
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
821 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
822 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
823 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
824 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
825
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
826 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
827 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
828
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
829 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
830 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
831 sys.path[:] = self.original_value
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
832
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
833
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
834 class TransientResource(object):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
835
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
836 """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
837 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
838
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
839 def __init__(self, exc, **kwargs):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
840 self.exc = exc
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
841 self.attrs = kwargs
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
842
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
843 def __enter__(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
844 return self
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
845
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
846 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
847 """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
848 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
849 propagate (if any)."""
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
850 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
851 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
852 if not hasattr(value, attr):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
853 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
854 if getattr(value, attr) != attr_value:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
855 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
856 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
857 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
858
54553
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
859 # 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
860 # with the Internet connection manifest themselves as exceptions.
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
861 # XXX deprecate these and use transient_internet() instead
54553
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
862 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
863 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
864 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
865
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
866
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
867 @contextlib.contextmanager
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
868 def transient_internet(resource_name, *, timeout=30.0, errnos=()):
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
869 """Return a context manager that raises ResourceDenied when various issues
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
870 with the Internet connection manifest themselves as exceptions."""
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
871 default_errnos = [
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
872 ('ECONNREFUSED', 111),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
873 ('ECONNRESET', 104),
67467
abe201dfd3dc Merged revisions 87861,87863 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67311
diff changeset
874 ('EHOSTUNREACH', 113),
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
875 ('ENETUNREACH', 101),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
876 ('ETIMEDOUT', 110),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
877 ]
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
878 default_gai_errnos = [
71269
ef4b40eb52cc Skip network tests when getaddrinfo() returns EAI_AGAIN, meaning a temporary
Antoine Pitrou <solipsis@pitrou.net>
parents: 71072
diff changeset
879 ('EAI_AGAIN', -3),
73919
c998c6f5464b Issue #13453: Catch EAI_FAIL in support.transient_internet.
Charles-François Natali <neologix@free.fr>
parents: 72642
diff changeset
880 ('EAI_FAIL', -4),
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
881 ('EAI_NONAME', -2),
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
882 ('EAI_NODATA', -5),
69676
89ebde7cd8ea Add WSANO_DATA to possible errors triggered by getaddrinfo (Windows)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68545
diff changeset
883 # Encountered when trying to resolve IPv6-only hostnames
89ebde7cd8ea Add WSANO_DATA to possible errors triggered by getaddrinfo (Windows)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68545
diff changeset
884 ('WSANO_DATA', 11004),
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
885 ]
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
886
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
887 denied = ResourceDenied("Resource '%s' is not available" % resource_name)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
888 captured_errnos = errnos
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
889 gai_errnos = []
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
890 if not captured_errnos:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
891 captured_errnos = [getattr(errno, name, num)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
892 for (name, num) in default_errnos]
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
893 gai_errnos = [getattr(socket, name, num)
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
894 for (name, num) in default_gai_errnos]
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
895
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
896 def filter_error(err):
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
897 n = getattr(err, 'errno', None)
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
898 if (isinstance(err, socket.timeout) or
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
899 (isinstance(err, socket.gaierror) and n in gai_errnos) or
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
900 n in captured_errnos):
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
901 if not verbose:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
902 sys.stderr.write(denied.args[0] + "\n")
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
903 raise denied from err
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
904
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
905 old_timeout = socket.getdefaulttimeout()
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
906 try:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
907 if timeout is not None:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
908 socket.setdefaulttimeout(timeout)
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
909 yield
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
910 except IOError as err:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
911 # urllib can wrap original socket errors multiple times (!), we must
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
912 # unwrap to get at the original error.
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
913 while True:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
914 a = err.args
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
915 if len(a) >= 1 and isinstance(a[0], IOError):
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
916 err = a[0]
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
917 # The error can also be wrapped as args[1]:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
918 # except socket.error as msg:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
919 # raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
920 elif len(a) >= 2 and isinstance(a[1], IOError):
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
921 err = a[1]
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
922 else:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
923 break
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
924 filter_error(err)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
925 raise
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
926 # XXX should we catch generic exceptions and look for their
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
927 # __cause__ or __context__?
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
928 finally:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
929 socket.setdefaulttimeout(old_timeout)
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
930
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
931
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
932 @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
933 def captured_output(stream_name):
70097
b2bcddfb8b18 Update __all__ and docstring.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70090
diff changeset
934 """Return a context manager used by captured_stdout/stdin/stderr
70089
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
935 that temporarily replaces the sys stream *stream_name* with a StringIO."""
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
936 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
937 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
938 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
939 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
940 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
941 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
942 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
943
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
944 def captured_stdout():
70089
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
945 """Capture the output of sys.stdout:
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
946
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
947 with captured_stdout() as s:
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
948 print("hello")
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
949 self.assertEqual(s.getvalue(), "hello")
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
950 """
46262
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
951 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
952
66843
612dd5f2aab3 Issue #10188 (partial resolution): tidy up some behaviour in the new tempfile.TemporaryDirectory context manager
Nick Coghlan <ncoghlan@gmail.com>
parents: 66817
diff changeset
953 def captured_stderr():
612dd5f2aab3 Issue #10188 (partial resolution): tidy up some behaviour in the new tempfile.TemporaryDirectory context manager
Nick Coghlan <ncoghlan@gmail.com>
parents: 66817
diff changeset
954 return captured_output("stderr")
612dd5f2aab3 Issue #10188 (partial resolution): tidy up some behaviour in the new tempfile.TemporaryDirectory context manager
Nick Coghlan <ncoghlan@gmail.com>
parents: 66817
diff changeset
955
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
956 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
957 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
958
70097
b2bcddfb8b18 Update __all__ and docstring.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70090
diff changeset
959
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
960 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
961 """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
962
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
963 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
964 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
965 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
966 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
967 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
968 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
969 """
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
970 gc.collect()
60517
b4f60df31b14 Merged revisions 79934 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59720
diff changeset
971 if is_jython:
b4f60df31b14 Merged revisions 79934 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59720
diff changeset
972 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
973 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
974 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
975
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
976
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
977 def python_is_optimized():
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
978 """Find if Python was built with optimizations."""
65805
b4819838eb5b PY_CFLAGS doesn't exist under Windows
Antoine Pitrou <solipsis@pitrou.net>
parents: 65725
diff changeset
979 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
980 final_opt = ""
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
981 for opt in cflags.split():
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
982 if opt.startswith('-O'):
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
983 final_opt = opt
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
984 return final_opt and final_opt != '-O0'
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
985
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
986
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
987 #=======================================================================
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
988 # 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
989 # 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
990
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
991 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
992 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
993 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
994 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
995 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
996 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
997 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
998 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
999 # 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
1000 raise
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1001 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1002 # 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
1003 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
1004 else:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1005 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
1006 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1007 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
1008 break
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1009 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1010 pass
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1011
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1012 # 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
1013 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1014 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
1015 finally:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1016 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
1017 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
1018 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
1019 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
1020 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
1021 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
1022
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1023 #=======================================================================
76644
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1024 # Decorator for running a function in a specific timezone, correctly
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1025 # resetting it afterwards.
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1026
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1027 def run_with_tz(tz):
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1028 def decorator(func):
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1029 def inner(*args, **kwds):
76651
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1030 try:
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1031 tzset = time.tzset
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1032 except AttributeError:
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1033 raise unittest.SkipTest("tzset required")
76644
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1034 if 'TZ' in os.environ:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1035 orig_tz = os.environ['TZ']
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1036 else:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1037 orig_tz = None
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1038 os.environ['TZ'] = tz
76651
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1039 tzset()
76644
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1040
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1041 # now run the function, resetting the tz on exceptions
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1042 try:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1043 return func(*args, **kwds)
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1044 finally:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1045 if orig_tz == None:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1046 del os.environ['TZ']
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1047 else:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1048 os.environ['TZ'] = orig_tz
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1049 time.tzset()
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1050
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1051 inner.__name__ = func.__name__
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1052 inner.__doc__ = func.__doc__
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1053 return inner
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1054 return decorator
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1055
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1056 #=======================================================================
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1057 # Big-memory-test support. Separate from 'resources' because memory use
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1058 # 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
1059
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1060 # 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
1061 # 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
1062 _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
1063 _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
1064 _2G = 2 * _1G
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1065 _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
1066
43100
4e6b4ba60c3b Remove the simple slicing API. All slicing is now done with slice objects.
Thomas Wouters <thomas@python.org>
parents: 43089
diff changeset
1067 MAX_Py_ssize_t = sys.maxsize
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1068
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1069 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
1070 global max_memuse
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1071 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
1072 sizes = {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1073 '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
1074 '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
1075 '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
1076 '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
1077 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1078 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
1079 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
1080 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
1081 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
1082 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
1083 real_max_memuse = memlimit
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1084 if memlimit > MAX_Py_ssize_t:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1085 memlimit = MAX_Py_ssize_t
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1086 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
1087 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
1088 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
1089
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1090 def _memory_watchdog(start_evt, finish_evt, period=10.0):
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1091 """A function which periodically watches the process' memory consumption
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1092 and prints it out.
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1093 """
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1094 # XXX: because of the GIL, and because the very long operations tested
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1095 # in most bigmem tests are uninterruptible, the loop below gets woken up
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1096 # much less often than expected.
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1097 # The polling code should be rewritten in raw C, without holding the GIL,
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1098 # and push results onto an anonymous pipe.
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1099 try:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1100 page_size = os.sysconf('SC_PAGESIZE')
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1101 except (ValueError, AttributeError):
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1102 try:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1103 page_size = os.sysconf('SC_PAGE_SIZE')
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1104 except (ValueError, AttributeError):
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1105 page_size = 4096
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1106 procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1107 try:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1108 f = open(procfile, 'rb')
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1109 except IOError as e:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1110 warnings.warn('/proc not available for stats: {}'.format(e),
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1111 RuntimeWarning)
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1112 sys.stderr.flush()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1113 return
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1114 with f:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1115 start_evt.set()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1116 old_data = -1
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1117 while not finish_evt.wait(period):
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1118 f.seek(0)
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1119 statm = f.read().decode('ascii')
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1120 data = int(statm.split()[5])
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1121 if data != old_data:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1122 old_data = data
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1123 print(" ... process data size: {data:.1f}G"
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1124 .format(data=data * page_size / (1024 ** 3)))
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1125
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1126 def bigmemtest(size, memuse, dry_run=True):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1127 """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
1128
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1129 '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
1130 test-interpreted units.) 'memuse' is the number of 'bytes per size' for
67594
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1131 the test, or a good estimate of it.
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1132
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1133 if 'dry_run' is False, it means the test doesn't support dummy runs
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1134 when -M is not specified.
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1135 """
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1136 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
1137 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
1138 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
1139 memuse = wrapper.memuse
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1140 if not real_max_memuse:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1141 maxsize = 5147
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1142 else:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1143 maxsize = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1144
72119
babc90f3cbf4 Issue #11564: Avoid crashes when trying to pickle huge objects or containers
Antoine Pitrou <solipsis@pitrou.net>
parents: 71612
diff changeset
1145 if ((real_max_memuse or not dry_run)
babc90f3cbf4 Issue #11564: Avoid crashes when trying to pickle huge objects or containers
Antoine Pitrou <solipsis@pitrou.net>
parents: 71612
diff changeset
1146 and real_max_memuse < maxsize * memuse):
babc90f3cbf4 Issue #11564: Avoid crashes when trying to pickle huge objects or containers
Antoine Pitrou <solipsis@pitrou.net>
parents: 71612
diff changeset
1147 raise unittest.SkipTest(
babc90f3cbf4 Issue #11564: Avoid crashes when trying to pickle huge objects or containers
Antoine Pitrou <solipsis@pitrou.net>
parents: 71612
diff changeset
1148 "not enough memory: %.1fG minimum needed"
babc90f3cbf4 Issue #11564: Avoid crashes when trying to pickle huge objects or containers
Antoine Pitrou <solipsis@pitrou.net>
parents: 71612
diff changeset
1149 % (size * memuse / (1024 ** 3)))
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1150
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1151 if real_max_memuse and verbose and threading:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1152 print()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1153 print(" ... expected peak memory use: {peak:.1f}G"
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1154 .format(peak=size * memuse / (1024 ** 3)))
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1155 sys.stdout.flush()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1156 start_evt = threading.Event()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1157 finish_evt = threading.Event()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1158 t = threading.Thread(target=_memory_watchdog,
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1159 args=(start_evt, finish_evt, 0.5))
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1160 t.daemon = True
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1161 t.start()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1162 start_evt.set()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1163 else:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1164 t = None
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1165
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1166 try:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1167 return f(self, maxsize)
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1168 finally:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1169 if t:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1170 finish_evt.set()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1171 t.join()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1172
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1173 wrapper.size = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1174 wrapper.memuse = memuse
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1175 return wrapper
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1176 return decorator
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1177
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1178 def bigaddrspacetest(f):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1179 """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
1180 def wrapper(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1181 if max_memuse < MAX_Py_ssize_t:
67594
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1182 if MAX_Py_ssize_t >= 2**63 - 1 and max_memuse >= 2**31:
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1183 raise unittest.SkipTest(
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1184 "not enough memory: try a 32-bit build instead")
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1185 else:
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1186 raise unittest.SkipTest(
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1187 "not enough memory: %.1fG minimum needed"
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1188 % (MAX_Py_ssize_t / (1024 ** 3)))
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1189 else:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1190 return f(self)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1191 return wrapper
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1192
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1193 #=======================================================================
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1194 # 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
1195
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
1196 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
1197 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
1198 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
1199 test(result)
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1200 return result
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1201
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
1202 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
1203 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
1204
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
1205 def requires_resource(resource):
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
1206 if resource == 'gui' and not _is_gui_available():
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
1207 return unittest.skip("resource 'gui' is not available")
65317
b83f0a667e7c Merged revisions 85482 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64605
diff changeset
1208 if is_resource_enabled(resource):
52389
d4e7470bd660 Merged revisions 70554,70588-70589,70598,70605,70611-70621,70623-70624,70626-70627 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 52069
diff changeset
1209 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
1210 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
1211 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
1212
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
1213 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
1214 """
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
1215 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
1216 """
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
1217 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
1218
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
1219 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
1220 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
1221 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
1222 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
1223 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
1224 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
1225 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
1226 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
1227 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
1228 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
1229 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
1230 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
1231
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
1232 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
1233 # 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
1234 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
1235 return ({'cpython': True}, False)
53487
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
1236 is_true = list(guards.values())[0]
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
1237 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
1238 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
1239
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
1240 # 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
1241 # 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
1242 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
1243 """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
1244 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
1245 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
1246 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
1247 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
1248 """
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
1249 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
1250 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
1251
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
1252
71612
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1253 def _filter_suite(suite, pred):
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1254 """Recursively filter test cases in a suite based on a predicate."""
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1255 newtests = []
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1256 for test in suite._tests:
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1257 if isinstance(test, unittest.TestSuite):
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1258 _filter_suite(test, pred)
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1259 newtests.append(test)
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1260 else:
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1261 if pred(test):
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1262 newtests.append(test)
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1263 suite._tests = newtests
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1264
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1265
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1266 def _run_suite(suite):
19995
b07cb51d731c run_suite(): Oops, update a docstring.
Barry Warsaw <barry@python.org>
parents: 19994
diff changeset
1267 """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
1268 if verbose:
71487
9f847dfba217 Issue #12624: It is now possible to fail after the first failure when
Antoine Pitrou <solipsis@pitrou.net>
parents: 71365
diff changeset
1269 runner = unittest.TextTestRunner(sys.stdout, verbosity=2,
9f847dfba217 Issue #12624: It is now possible to fail after the first failure when
Antoine Pitrou <solipsis@pitrou.net>
parents: 71365
diff changeset
1270 failfast=failfast)
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1271 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
1272 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
1273
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
1274 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
1275 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
1276 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
1277 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
1278 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
1279 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
1280 else:
56949
a795529b09c9 Merged revisions 75525,75530,75922 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 55594
diff changeset
1281 err = "multiple errors occurred"
a795529b09c9 Merged revisions 75525,75530,75922 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 55594
diff changeset
1282 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
1283 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
1284
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
1285
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1286 def run_unittest(*classes):
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1287 """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
1288 valid_types = (unittest.TestSuite, unittest.TestCase)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
1289 suite = unittest.TestSuite()
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1290 for cls in classes:
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43100
diff changeset
1291 if isinstance(cls, str):
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1292 if cls in sys.modules:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1293 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
1294 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1295 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
1296 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
1297 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
1298 else:
3f214b39b4df run_unittest() to support TestCase instances as well as classes. Helps with doctests.
Raymond Hettinger <python@rcn.com>
parents: 29142
diff changeset
1299 suite.addTest(unittest.makeSuite(cls))
71612
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1300 def case_pred(test):
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1301 if match_tests is None:
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1302 return True
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1303 for name in test.id().split("."):
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1304 if fnmatch.fnmatchcase(name, match_tests):
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1305 return True
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1306 return False
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1307 _filter_suite(suite, case_pred)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1308 _run_suite(suite)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
1309
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
1310
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
1311 #=======================================================================
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
1312 # 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
1313
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
1314 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
1315 """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
1316
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
1317 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
1318 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
1319 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
1320 """
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
1321
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
1322 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
1323
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
1324 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
1325 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
1326 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
1327 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
1328
71072
d8ba59de860a Issue #12400: test.support.run_doctest() doesn't change sys.stdout anymore
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70814
diff changeset
1329 f, t = doctest.testmod(module, verbose=verbosity)
d8ba59de860a Issue #12400: test.support.run_doctest() doesn't change sys.stdout anymore
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70814
diff changeset
1330 if f:
d8ba59de860a Issue #12400: test.support.run_doctest() doesn't change sys.stdout anymore
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70814
diff changeset
1331 raise TestFailed("%d of %d doctests failed" % (f, t))
29140
e57e22aa56a4 Provide a clue that the doctests have run.
Raymond Hettinger <python@rcn.com>
parents: 29066
diff changeset
1332 if verbose:
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1333 print('doctest (%s) ... %d tests with zero failures' %
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1334 (module.__name__, t))
29140
e57e22aa56a4 Provide a clue that the doctests have run.
Raymond Hettinger <python@rcn.com>
parents: 29066
diff changeset
1335 return f, t
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1336
57215
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1337
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1338 #=======================================================================
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1339 # Support for saving and restoring the imported modules.
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1340
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1341 def modules_setup():
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1342 return sys.modules.copy(),
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1343
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1344 def modules_cleanup(oldmodules):
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1345 # Encoders/decoders are registered permanently within the internal
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1346 # codec cache. If we destroy the corresponding modules their
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1347 # globals will be set to None which will trip up the cached functions.
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1348 encodings = [(k, v) for k, v in sys.modules.items()
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1349 if k.startswith('encodings.')]
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1350 sys.modules.clear()
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1351 sys.modules.update(encodings)
67527
db8d15933121 Issue 10556: test_zipimport_support implicitly imports too many modules (including _ssl) to safely clobber sys.modules after each test
Nick Coghlan <ncoghlan@gmail.com>
parents: 67466
diff changeset
1352 # XXX: This kind of problem can affect more than just encodings. In particular
67528
Eric Smith <eric@trueblade.com>
parents: 67527
diff changeset
1353 # extension modules (such as _ssl) don't cope with reloading properly.
67527
db8d15933121 Issue 10556: test_zipimport_support implicitly imports too many modules (including _ssl) to safely clobber sys.modules after each test
Nick Coghlan <ncoghlan@gmail.com>
parents: 67466
diff changeset
1354 # Really, test modules should be cleaning out the test specific modules they
db8d15933121 Issue 10556: test_zipimport_support implicitly imports too many modules (including _ssl) to safely clobber sys.modules after each test
Nick Coghlan <ncoghlan@gmail.com>
parents: 67466
diff changeset
1355 # know they added (ala test_runpy) rather than relying on this function (as
db8d15933121 Issue 10556: test_zipimport_support implicitly imports too many modules (including _ssl) to safely clobber sys.modules after each test
Nick Coghlan <ncoghlan@gmail.com>
parents: 67466
diff changeset
1356 # test_importhooks and test_pkg do currently).
db8d15933121 Issue 10556: test_zipimport_support implicitly imports too many modules (including _ssl) to safely clobber sys.modules after each test
Nick Coghlan <ncoghlan@gmail.com>
parents: 67466
diff changeset
1357 # Implicitly imported *real* modules should be left alone (see issue 10556).
57215
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1358 sys.modules.update(oldmodules)
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1359
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1360 #=======================================================================
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1361 # 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
1362
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1363 # 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
1364 # 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
1365 # 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
1366 # unregistered from the threading module.
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1367 # 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
1368 # __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
1369 # at the end of a test run.
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1370
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1371 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
1372 if _thread:
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1373 return _thread._count(), threading._dangling.copy()
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1374 else:
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1375 return 1, ()
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1376
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1377 def threading_cleanup(*original_values):
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1378 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
1379 return
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1380 _MAX_COUNT = 10
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1381 for count in range(_MAX_COUNT):
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1382 values = _thread._count(), threading._dangling
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1383 if values == original_values:
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1384 break
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1385 time.sleep(0.1)
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1386 gc_collect()
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1387 # 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
1388
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
1389 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
1390 """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
1391 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
1392 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
1393 """
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1394 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
1395 return func
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1396
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
1397 @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
1398 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
1399 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
1400 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
1401 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
1402 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
1403 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
1404 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
1405
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1406 def reap_children():
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1407 """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
1408 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
1409 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
1410 for refleaks.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1411 """
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1412
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1413 # 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
1414 # 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
1415 if hasattr(os, 'waitpid'):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1416 any_process = -1
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1417 while True:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1418 try:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1419 # 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
1420 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
1421 if pid == 0:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1422 break
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1423 except:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1424 break
67311
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1425
59654
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1426 @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
1427 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
1428 """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
1429
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1430 Usage:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1431 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
1432 ...
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1433
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1434 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
1435 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
1436 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
1437 block.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1438 """
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1439 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
1440 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
1441 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
1442 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1443 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1444 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1445 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
1446 else:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1447 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
1448 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1449 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1450 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1451 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
1452
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1453 @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
1454 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
1455 """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
1456
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1457 Usage:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1458 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
1459 ...
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1460
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1461 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
1462 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
1463 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
1464 block.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1465 """
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1466 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
1467 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
1468 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
1469 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1470 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1471 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1472 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
1473 else:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1474 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
1475 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1476 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1477 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1478 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
1479
67311
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1480 def strip_python_stderr(stderr):
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1481 """Strip the stderr of a Python process from potential debug output
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1482 emitted by the interpreter.
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1483
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1484 This will typically be run on the result of the communicate() method
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1485 of a subprocess.Popen object.
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1486 """
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1487 stderr = re.sub(br"\[\d+ refs\]\r?\n?$", b"", stderr).strip()
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1488 return stderr
68544
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1489
65304
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1490 def args_from_interpreter_flags():
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1491 """Return a list of command-line arguments reproducing the current
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1492 settings in sys.flags."""
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1493 flag_opt_map = {
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1494 'bytes_warning': 'b',
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1495 'dont_write_bytecode': 'B',
75093
28dc6177c28f Make "regrtest -j" "-R"-aware
Antoine Pitrou <solipsis@pitrou.net>
parents: 73919
diff changeset
1496 'hash_randomization': 'R',
65304
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1497 'ignore_environment': 'E',
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1498 'no_user_site': 's',
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1499 'no_site': 'S',
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1500 'optimize': 'O',
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1501 'verbose': 'v',
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1502 }
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1503 args = []
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1504 for flag, opt in flag_opt_map.items():
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1505 v = getattr(sys.flags, flag)
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1506 if v > 0:
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1507 args.append('-' + opt * v)
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1508 return args
66816
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1509
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1510 #============================================================
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1511 # Support for assertions about logging.
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1512 #============================================================
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1513
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1514 class TestHandler(logging.handlers.BufferingHandler):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1515 def __init__(self, matcher):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1516 # BufferingHandler takes a "capacity" argument
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1517 # so as to know when to flush. As we're overriding
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1518 # shouldFlush anyway, we can set a capacity of zero.
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1519 # You can call flush() manually to clear out the
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1520 # buffer.
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1521 logging.handlers.BufferingHandler.__init__(self, 0)
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1522 self.matcher = matcher
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1523
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1524 def shouldFlush(self):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1525 return False
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1526
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1527 def emit(self, record):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1528 self.format(record)
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1529 self.buffer.append(record.__dict__)
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1530
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1531 def matches(self, **kwargs):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1532 """
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1533 Look for a saved dict whose keys/values match the supplied arguments.
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1534 """
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1535 result = False
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1536 for d in self.buffer:
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1537 if self.matcher.matches(d, **kwargs):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1538 result = True
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1539 break
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1540 return result
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1541
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1542 class Matcher(object):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1543
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1544 _partial_matches = ('msg', 'message')
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1545
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1546 def matches(self, d, **kwargs):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1547 """
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1548 Try to match a single dict with the supplied arguments.
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1549
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1550 Keys whose values are strings and which are in self._partial_matches
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1551 will be checked for partial (i.e. substring) matches. You can extend
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1552 this scheme to (for example) do regular expression matching, etc.
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1553 """
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1554 result = True
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1555 for k in kwargs:
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1556 v = kwargs[k]
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1557 dv = d.get(k)
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1558 if not self.match_value(k, dv, v):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1559 result = False
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1560 break
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1561 return result
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1562
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1563 def match_value(self, k, dv, v):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1564 """
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1565 Try to match a single stored value (dv) with a supplied value (v).
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1566 """
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1567 if type(v) != type(dv):
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1568 result = False
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1569 elif type(dv) is not str or k not in self._partial_matches:
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1570 result = (v == dv)
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1571 else:
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1572 result = dv.find(v) >= 0
9cb2ecbb1f0c test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 66717
diff changeset
1573 return result
67183
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1574
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1575
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1576 _can_symlink = None
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1577 def can_symlink():
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1578 global _can_symlink
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1579 if _can_symlink is not None:
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1580 return _can_symlink
70698
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1581 symlink_path = TESTFN + "can_symlink"
67183
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1582 try:
70698
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1583 os.symlink(TESTFN, symlink_path)
67183
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1584 can = True
70811
1a3e8db28d49 Fix #12084. os.stat on Windows wasn't working properly with relative symlinks.
Brian Curtin <brian@python.org>
parents: 70575
diff changeset
1585 except (OSError, NotImplementedError, AttributeError):
67183
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1586 can = False
70698
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1587 else:
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1588 os.remove(symlink_path)
67183
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1589 _can_symlink = can
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1590 return can
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1591
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1592 def skip_unless_symlink(test):
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1593 """Skip decorator for tests that require functional symlink"""
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1594 ok = can_symlink()
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1595 msg = "Requires functional symlink implementation"
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1596 return test if ok else unittest.skip(msg)(test)
68545
1bf4383f190a Merge fix for issue #11501
Antoine Pitrou <solipsis@pitrou.net>
parents: 68257 68544
diff changeset
1597
68544
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1598 def patch(test_instance, object_to_patch, attr_name, new_value):
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1599 """Override 'object_to_patch'.'attr_name' with 'new_value'.
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1600
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1601 Also, add a cleanup procedure to 'test_instance' to restore
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1602 'object_to_patch' value for 'attr_name'.
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1603 The 'attr_name' should be a valid attribute for 'object_to_patch'.
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1604
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1605 """
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1606 # check that 'attr_name' is a real attribute for 'object_to_patch'
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1607 # will raise AttributeError if it does not exist
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1608 getattr(object_to_patch, attr_name)
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1609
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1610 # keep a copy of the old value
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1611 attr_is_local = False
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1612 try:
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1613 old_value = object_to_patch.__dict__[attr_name]
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1614 except (AttributeError, KeyError):
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1615 old_value = getattr(object_to_patch, attr_name, None)
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1616 else:
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1617 attr_is_local = True
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1618
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1619 # restore the value when the test is done
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1620 def cleanup():
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1621 if attr_is_local:
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1622 setattr(object_to_patch, attr_name, old_value)
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1623 else:
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1624 delattr(object_to_patch, attr_name)
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1625
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1626 test_instance.addCleanup(cleanup)
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1627
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1628 # actually override the attribute
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1629 setattr(object_to_patch, attr_name, new_value)