annotate Lib/test/support.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents 332b93ce7bf9
children 6017f09ead53 67d69f943b7f
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
68112
7f8da10bfcef Fix imports from collections.abc
Raymond Hettinger <python@rcn.com>
parents: 68094
diff changeset
18 import collections.abc
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
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
26 import struct
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
27 import tempfile
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
28 import _testcapi
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
29
61073
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
30 try:
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
31 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
32 except ImportError:
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
33 _thread = None
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
34 threading = None
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
35 try:
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
36 import multiprocessing.process
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
37 except ImportError:
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
38 multiprocessing = None
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
39
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
40 try:
70208
cfa2feb39c1f Skip tests that require zlib in the packaging tests. Also add a requires_zlib decorator to test.support.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70098
diff changeset
41 import zlib
cfa2feb39c1f Skip tests that require zlib in the packaging tests. Also add a requires_zlib decorator to test.support.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70098
diff changeset
42 except ImportError:
cfa2feb39c1f Skip tests that require zlib in the packaging tests. Also add a requires_zlib decorator to test.support.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70098
diff changeset
43 zlib = None
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
44
76682
028e8e0b03e8 Issue #14371: Support bzip2 in zipfile module.
Martin v. Löwis <martin@v.loewis.de>
parents: 76652
diff changeset
45 try:
028e8e0b03e8 Issue #14371: Support bzip2 in zipfile module.
Martin v. Löwis <martin@v.loewis.de>
parents: 76652
diff changeset
46 import bz2
028e8e0b03e8 Issue #14371: Support bzip2 in zipfile module.
Martin v. Löwis <martin@v.loewis.de>
parents: 76652
diff changeset
47 except ImportError:
028e8e0b03e8 Issue #14371: Support bzip2 in zipfile module.
Martin v. Löwis <martin@v.loewis.de>
parents: 76652
diff changeset
48 bz2 = None
028e8e0b03e8 Issue #14371: Support bzip2 in zipfile module.
Martin v. Löwis <martin@v.loewis.de>
parents: 76652
diff changeset
49
76895
fccdcd83708a Issue #14366: Support lzma compression in zip files.
Martin v. Löwis <martin@v.loewis.de>
parents: 76883
diff changeset
50 try:
fccdcd83708a Issue #14366: Support lzma compression in zip files.
Martin v. Löwis <martin@v.loewis.de>
parents: 76883
diff changeset
51 import lzma
fccdcd83708a Issue #14366: Support lzma compression in zip files.
Martin v. Löwis <martin@v.loewis.de>
parents: 76883
diff changeset
52 except ImportError:
fccdcd83708a Issue #14366: Support lzma compression in zip files.
Martin v. Löwis <martin@v.loewis.de>
parents: 76883
diff changeset
53 lzma = None
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
54
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
55 __all__ = [
77113
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
56 "Error", "TestFailed", "ResourceDenied", "import_module", "verbose",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
57 "use_resources", "max_memuse", "record_original_stdout",
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
58 "get_original_stdout", "unload", "unlink", "rmtree", "forget",
72618
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
59 "is_resource_enabled", "requires", "requires_freebsd_version",
77113
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
60 "requires_linux_version", "requires_mac_ver", "find_unused_port",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
61 "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
62 "temp_cwd", "findfile", "create_empty_file", "sortdict",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
63 "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
64 "EnvironmentVarGuard", "TransientResource", "captured_stdout",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
65 "captured_stdin", "captured_stderr", "time_out", "socket_peer_reset",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
66 "ioerror_peer_reset", "run_with_locale", 'temp_umask',
69672
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
67 "transient_internet", "set_memlimit", "bigmemtest", "bigaddrspacetest",
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
68 "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup",
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
69 "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail",
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
70 "get_attribute", "swap_item", "swap_attr", "requires_IEEE_754",
69943
ae6cd69ce9f8 merge 3.1
Benjamin Peterson <benjamin@python.org>
parents: 69676 69942
diff changeset
71 "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
77113
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
72 "skip_unless_xattr", "import_fresh_module", "requires_zlib",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
73 "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz",
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
74 "requires_bz2", "requires_lzma"
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
75 ]
47317
ba8015e23487 Merged revisions 63698 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 47201
diff changeset
76
13682
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
77 class Error(Exception):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
78 """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
79
7de18f04f85a Restore TestSkipped exception; appears to have disappeared in last checkin.
Fred Drake <fdrake@acm.org>
parents: 13647
diff changeset
80 class TestFailed(Error):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
81 """Test failed."""
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82
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
83 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
84 """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
85
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
86 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
87 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
88 and unexpected skips.
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
89 """
974f196abb87 test_support.requires(): Instead of raising TestSkipped, raise a new
Fred Drake <fdrake@acm.org>
parents: 26527
diff changeset
90
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
91 @contextlib.contextmanager
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
92 def _ignore_deprecated_imports(ignore=True):
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
93 """Context manager to suppress package and module deprecation
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
94 warnings when importing them.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
95
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
96 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
97 if ignore:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
98 with warnings.catch_warnings():
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
99 warnings.filterwarnings("ignore", ".+ (module|package)",
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
100 DeprecationWarning)
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
101 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
102 else:
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
103 yield
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
104
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
105
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
106 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
107 """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
108 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
109
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
110 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
111 will be suppressed."""
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
112 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
113 try:
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
114 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
115 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
116 raise unittest.SkipTest(str(msg))
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
117
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
118
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
119 def _save_and_remove_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
120 """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
121
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
122 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
123 # 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
124 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
125 __import__(name)
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
126 del sys.modules[name]
70081
9b7bfe86f04d Change import_fresh_module to work with packages.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 69955
diff changeset
127 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
128 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
129 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
130 del sys.modules[modname]
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
131
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
132 def _save_and_block_module(name, orig_modules):
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
133 """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
134
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
135 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
136 saved = True
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
137 try:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
138 orig_modules[name] = sys.modules[name]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
139 except KeyError:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
140 saved = False
62999
daea978a48ae Merged revisions 82850 via svnmerge from
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 61581
diff changeset
141 sys.modules[name] = None
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
142 return saved
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
143
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
144
72400
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
145 def anticipate_failure(condition):
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
146 """Decorator to mark a test that is known to be broken in some cases
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
147
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
148 Any use of this decorator should have a comment identifying the
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
149 associated tracker issue.
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
150 """
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
151 if condition:
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
152 return unittest.expectedFailure
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
153 return lambda f: f
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
154
a4e4facad164 Close issue 12958 by flagging expected failures in test_socket on Mac OS X
Nick Coghlan <ncoghlan@gmail.com>
parents: 72137
diff changeset
155
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
156 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
157 """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
158 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
159 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
160
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
161 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
162 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
163
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
164 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
165 takes place.
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
166
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
167 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
168 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
169 # 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
170 # 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
171 with _ignore_deprecated_imports(deprecated):
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
172 # 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
173 # 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
174 orig_modules = {}
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
175 names_to_remove = []
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
176 _save_and_remove_module(name, orig_modules)
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
177 try:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
178 for fresh_name in fresh:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
179 _save_and_remove_module(fresh_name, orig_modules)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
180 for blocked_name in blocked:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
181 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
182 names_to_remove.append(blocked_name)
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
183 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
184 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
185 fresh_module = None
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
186 finally:
53317
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
187 for orig_name, module in orig_modules.items():
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
188 sys.modules[orig_name] = module
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
189 for name_to_remove in names_to_remove:
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
190 del sys.modules[name_to_remove]
b5df094d8941 Merged revisions 71799 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 53051
diff changeset
191 return fresh_module
53051
f652fe1649ed Merged revisions 71465 via svnmerge from
Nick Coghlan <ncoghlan@gmail.com>
parents: 52625
diff changeset
192
46769
5d15a8bcc445 Merged revisions 62873,62887,62892-62896,62904 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46664
diff changeset
193
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
194 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
195 """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
196 try:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
197 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
198 except AttributeError:
72733
472ee6ed7949 Update skip message printed by test.support.get_attribute.
Éric Araujo <merwok@netwok.org>
parents: 72647
diff changeset
199 raise unittest.SkipTest("object %r has no attribute %r" % (obj, name))
52625
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
200 else:
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
201 return attribute
f84340886936 Merged revisions 70734,70775,70856,70874,70876-70877 via svnmerge
R. David Murray <rdmurray@bitdance.com>
parents: 52389
diff changeset
202
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
203 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
204 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
205 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
206 # small sizes, to make sure they work.)
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
207 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
208 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
209 match_tests = None
4791
a2fd80eed27f Add verbose flag for regression test to clear.
Guido van Rossum <guido@python.org>
parents: 1197
diff changeset
210
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
211 # _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
212 # 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
213 # 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
214 _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
215 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
216 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
217 _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
218
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
219 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
220 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
221
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 def unload(name):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
223 try:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
224 del sys.modules[name]
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
225 except KeyError:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
226 pass
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227
78551
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
228 if sys.platform.startswith("win"):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
229 def _waitfor(func, pathname, waitall=False):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
230 # Peform the operation
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
231 func(pathname)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
232 # Now setup the wait loop
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
233 if waitall:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
234 dirname = pathname
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
235 else:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
236 dirname, name = os.path.split(pathname)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
237 dirname = dirname or '.'
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
238 # Check for `pathname` to be removed from the filesystem.
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
239 # The exponential backoff of the timeout amounts to a total
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
240 # of ~1 second after which the deletion is probably an error
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
241 # anyway.
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
242 # Testing on a i7@4.3GHz shows that usually only 1 iteration is
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
243 # required when contention occurs.
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
244 timeout = 0.001
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
245 while timeout < 1.0:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
246 # Note we are only testing for the existance of the file(s) in
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
247 # the contents of the directory regardless of any security or
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
248 # access rights. If we have made it this far, we have sufficient
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
249 # permissions to do that much using Python's equivalent of the
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
250 # Windows API FindFirstFile.
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
251 # Other Windows APIs can fail or give incorrect results when
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
252 # dealing with files that are pending deletion.
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
253 L = os.listdir(dirname)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
254 if not (L if waitall else name in L):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
255 return
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
256 # Increase the timeout and try again
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
257 time.sleep(timeout)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
258 timeout *= 2
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
259 warnings.warn('tests may fail, delete still pending for ' + pathname,
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
260 RuntimeWarning, stacklevel=4)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
261
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
262 def _unlink(filename):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
263 _waitfor(os.unlink, filename)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
264
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
265 def _rmdir(dirname):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
266 _waitfor(os.rmdir, dirname)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
267
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
268 def _rmtree(path):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
269 def _rmtree_inner(path):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
270 for name in os.listdir(path):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
271 fullname = os.path.join(path, name)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
272 if os.path.isdir(fullname):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
273 _waitfor(_rmtree_inner, fullname, waitall=True)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
274 os.rmdir(fullname)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
275 else:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
276 os.unlink(fullname)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
277 _waitfor(_rmtree_inner, path, waitall=True)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
278 _waitfor(os.rmdir, path)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
279 else:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
280 _unlink = os.unlink
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
281 _rmdir = os.rmdir
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
282 _rmtree = shutil.rmtree
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
283
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
284 def unlink(filename):
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
285 try:
78551
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
286 _unlink(filename)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
287 except OSError as error:
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
288 # 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
289 if error.errno not in (errno.ENOENT, errno.ENOTDIR):
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
290 raise
36382
99d491faa65c Convenience function to remove a possibly non-existant file
Neal Norwitz <nnorwitz@gmail.com>
parents: 35998
diff changeset
291
78551
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
292 def rmdir(dirname):
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
293 try:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
294 _rmdir(dirname)
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
295 except OSError as error:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
296 # The directory need not exist.
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
297 if error.errno != errno.ENOENT:
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
298 raise
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
299
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
300 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
301 try:
78551
fcad4566910b Fix #15496. Add directory removal helpers to make Windows tests more reliable. Patch by Jeremy Kloth
Brian Curtin <brian@python.org>
parents: 78315
diff changeset
302 _rmtree(path)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
303 except OSError as error:
72137
b5a5bd429580 Remove misleading comment and code.
Antoine Pitrou <solipsis@pitrou.net>
parents: 72120
diff changeset
304 if error.errno != errno.ENOENT:
45514
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
305 raise
fce5af5ce16a Merged revisions 61038,61042-61045,61047,61049-61053,61055-61057 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 45471
diff changeset
306
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
307 def make_legacy_pyc(source):
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
308 """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
309
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
310 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
311 value.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
312
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
313 :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
314 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
315 :return: The file system path to the legacy pyc file.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
316 """
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
317 pyc_file = imp.cache_from_source(source)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
318 up_one = os.path.dirname(os.path.abspath(source))
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
319 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
320 os.rename(pyc_file, legacy_pyc)
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
321 return legacy_pyc
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
322
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 def forget(modname):
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
324 """'Forget' a module was ever imported.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
325
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
326 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
327 legacy .pyc and .pyo files.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
328 """
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
329 unload(modname)
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
330 for dirname in sys.path:
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
331 source = os.path.join(dirname, modname + '.py')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
332 # It doesn't matter if they exist or not, unlink all possible
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
333 # combinations of PEP 3147 and legacy pyc and pyo files.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
334 unlink(source + 'c')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
335 unlink(source + 'o')
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
336 unlink(imp.cache_from_source(source, debug_override=True))
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
337 unlink(imp.cache_from_source(source, debug_override=False))
653
74942ec70430 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
338
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
339 # 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
340 # in `use_resources'.
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
341 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
342 import ctypes
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
343 import ctypes.wintypes
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
344 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
345 UOI_FLAGS = 1
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
346 WSF_VISIBLE = 0x0001
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
347 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
348 _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
349 ("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
350 ("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
351 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
352 h = dll.GetProcessWindowStation()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
353 if not h:
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
354 raise ctypes.WinError()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
355 uof = USEROBJECTFLAGS()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
356 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
357 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
358 UOI_FLAGS,
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
359 ctypes.byref(uof),
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
360 ctypes.sizeof(uof),
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
361 ctypes.byref(needed))
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
362 if not res:
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
363 raise ctypes.WinError()
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
364 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
365 else:
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
366 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
367 return True
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
368
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
369 def is_resource_enabled(resource):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
370 """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
371 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
372 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
373
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
374 def requires(resource, msg=None):
28968
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
375 """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
376
b174d0927f0e 'forget' now also deletes any proper .pyo files.
Brett Cannon <bcannon@gmail.com>
parents: 28917
diff changeset
377 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
378 possibility of False being returned occurs when regrtest.py is
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
379 executing.
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
380 """
68054
f8a77fd675f5 Merged revisions 88460,88464,88466,88486,88511,88652 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67594
diff changeset
381 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
382 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
383 # 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
384 # 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
385 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
386 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
387 if not is_resource_enabled(resource):
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
388 if msg is None:
71343
cdb0ae616d58 Always use repr for regrtest resources names
Éric Araujo <merwok@netwok.org>
parents: 71331
diff changeset
389 msg = "Use of the %r 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
390 raise ResourceDenied(msg)
19416
a6ce2d16d739 use_large_resources => use_resources
Barry Warsaw <barry@python.org>
parents: 19343
diff changeset
391
72618
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
392 def _requires_unix_version(sysname, min_version):
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
393 """Decorator raising SkipTest if the OS is `sysname` and the version is less
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
394 than `min_version`.
70612
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
395
72618
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
396 For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
397 the FreeBSD version is less than 7.2.
70612
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
398 """
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
399 def decorator(func):
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
400 @functools.wraps(func)
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
401 def wrapper(*args, **kw):
72618
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
402 if platform.system() == sysname:
70612
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
403 version_txt = platform.release().split('-', 1)[0]
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
404 try:
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
405 version = tuple(map(int, version_txt.split('.')))
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
406 except ValueError:
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
407 pass
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
408 else:
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
409 if version < min_version:
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
410 min_version_txt = '.'.join(map(str, min_version))
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
411 raise unittest.SkipTest(
72618
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
412 "%s version %s or higher required, not %s"
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
413 % (sysname, min_version_txt, version_txt))
70612
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
414 return wrapper
277bbe6cae53 Issue #12196: Make test.support's requires_linux_version a decorator.
Charles-François Natali <neologix@free.fr>
parents: 70576
diff changeset
415 return decorator
70324
d585a6d548a3 Issue #12158: Move linux_version() from test_socket to test.support
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70208
diff changeset
416
72618
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
417 def requires_freebsd_version(*min_version):
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
418 """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
419 less than `min_version`.
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
420
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
421 For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
422 version is less than 7.2.
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
423 """
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
424 return _requires_unix_version('FreeBSD', min_version)
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
425
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
426 def requires_linux_version(*min_version):
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
427 """Decorator raising SkipTest if the OS is Linux and the Linux version is
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
428 less than `min_version`.
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
429
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
430 For example, @requires_linux_version(2, 6, 32) raises SkipTest if the Linux
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
431 version is less than 2.6.32.
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
432 """
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
433 return _requires_unix_version('Linux', min_version)
3b1859f80e6d Introduce support.requires_freebsd_version decorator.
Charles-François Natali <neologix@free.fr>
parents: 72400
diff changeset
434
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
435 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
436 """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
437 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
438
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
439 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
440 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
441 """
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
442 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
443 @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
444 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
445 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
446 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
447 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
448 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
449 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
450 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
451 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
452 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
453 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
454 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
455 "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
456 % (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
457 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
458 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
459 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
460 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
461
70574
35212b113730 test.support: add requires_mac_ver() function
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70474
diff changeset
462
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
463 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
464
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
465 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
466 """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
467 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
468 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
469 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
470 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
471 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
472
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
473 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
474 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
475 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
476 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
477 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
478 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
479 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
480 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
481 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
482 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
483 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
484 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
485 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
486 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
487
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
488 (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
489 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
490 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
491 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
492 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
493 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
494
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
495 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
496 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
497 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
498 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
499 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
500 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
501
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
502 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
503 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
504 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
505 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
506 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
507 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
508 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
509 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
510 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
511 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
512
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
513 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
514 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
515 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
516 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
517 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
518 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
519 """
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
520
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
521 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
522 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
523 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
524 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
525 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
526
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
527 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
528 """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
529 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
530 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
531 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
532 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
533 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
534 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
535 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
536
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
537 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
538 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
539 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
540 """
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
541
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
542 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
543 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
544 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
545 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
546 "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
547 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
548 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
549 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
550 "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
551 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
552 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
553
2e917b0c8f6e Merged revisions 62194,62197-62198,62204-62205,62214,62219-62221,62227,62229-62231,62233-62235,62237-62239 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46262
diff changeset
554 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
555 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
556 return port
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
557
69672
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
558 def _is_ipv6_enabled():
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
559 """Check whether IPv6 is enabled on this host."""
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
560 if socket.has_ipv6:
77978
c9299edf1f67 #15277: Fix a resource leak in support.py when IPv6 is disabled.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 77597
diff changeset
561 sock = None
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
562 try:
69672
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
563 sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
564 sock.bind(('::1', 0))
77978
c9299edf1f67 #15277: Fix a resource leak in support.py when IPv6 is disabled.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 77597
diff changeset
565 return True
69672
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
566 except (socket.error, socket.gaierror):
15305
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
567 pass
77978
c9299edf1f67 #15277: Fix a resource leak in support.py when IPv6 is disabled.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 77597
diff changeset
568 finally:
c9299edf1f67 #15277: Fix a resource leak in support.py when IPv6 is disabled.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 77597
diff changeset
569 if sock:
c9299edf1f67 #15277: Fix a resource leak in support.py when IPv6 is disabled.
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 77597
diff changeset
570 sock.close()
69672
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
571 return False
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
572
0518f32cb747 Issue #11811: Factor out detection of IPv6 support on the current host
Antoine Pitrou <solipsis@pitrou.net>
parents: 68921
diff changeset
573 IPV6_ENABLED = _is_ipv6_enabled()
1197
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
574
70474
866d959dea8e Issue #12196: Add PIPE_MAX_SIZE to test.support, constant larger than the
Charles-François Natali <neologix@free.fr>
parents: 70324
diff changeset
575
866d959dea8e Issue #12196: Add PIPE_MAX_SIZE to test.support, constant larger than the
Charles-François Natali <neologix@free.fr>
parents: 70324
diff changeset
576 # A constant likely larger than the underlying OS pipe buffer size.
866d959dea8e Issue #12196: Add PIPE_MAX_SIZE to test.support, constant larger than the
Charles-François Natali <neologix@free.fr>
parents: 70324
diff changeset
577 # Windows limit seems to be around 512B, and most Unix kernels have a 64K pipe
866d959dea8e Issue #12196: Add PIPE_MAX_SIZE to test.support, constant larger than the
Charles-François Natali <neologix@free.fr>
parents: 70324
diff changeset
578 # buffer size: take 1M to be sure.
866d959dea8e Issue #12196: Add PIPE_MAX_SIZE to test.support, constant larger than the
Charles-François Natali <neologix@free.fr>
parents: 70324
diff changeset
579 PIPE_MAX_SIZE = 1024 * 1024
866d959dea8e Issue #12196: Add PIPE_MAX_SIZE to test.support, constant larger than the
Charles-François Natali <neologix@free.fr>
parents: 70324
diff changeset
580
1197
675a02820d66 * os.py: _exit doesn't exist in all variations of posix
Guido van Rossum <guido@python.org>
parents: 653
diff changeset
581
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
582 # 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
583 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
584 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
585 "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
586
70208
cfa2feb39c1f Skip tests that require zlib in the packaging tests. Also add a requires_zlib decorator to test.support.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70098
diff changeset
587 requires_zlib = unittest.skipUnless(zlib, 'requires zlib')
cfa2feb39c1f Skip tests that require zlib in the packaging tests. Also add a requires_zlib decorator to test.support.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70098
diff changeset
588
76682
028e8e0b03e8 Issue #14371: Support bzip2 in zipfile module.
Martin v. Löwis <martin@v.loewis.de>
parents: 76652
diff changeset
589 requires_bz2 = unittest.skipUnless(bz2, 'requires bz2')
028e8e0b03e8 Issue #14371: Support bzip2 in zipfile module.
Martin v. Löwis <martin@v.loewis.de>
parents: 76652
diff changeset
590
76895
fccdcd83708a Issue #14366: Support lzma compression in zip files.
Martin v. Löwis <martin@v.loewis.de>
parents: 76883
diff changeset
591 requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
fccdcd83708a Issue #14366: Support lzma compression in zip files.
Martin v. Löwis <martin@v.loewis.de>
parents: 76883
diff changeset
592
25982
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
593 is_jython = sys.platform.startswith('java')
e1bf4604c0a5 Patch #631972: Adds an is_jython flag.
Finn Bock <bckfnn@worldonline.dk>
parents: 24442
diff changeset
594
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
595 # 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
596 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
597 # 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
598 TESTFN = '$test'
29066
90342f395721 Patch #734231: Update RiscOS support. In particular, correct
Martin v. Löwis <martin@v.loewis.de>
parents: 28968
diff changeset
599 else:
17213
4d6ee7f2bee6 In Jython, `@' is not allowed in module names. Extend the TESTFN test
Barry Warsaw <barry@python.org>
parents: 17171
diff changeset
600 TESTFN = '@test'
41993
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
601
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
602 # 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
603 # module name.
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
604 TESTFN = "{}_{}_tmp".format(TESTFN, os.getpid())
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
605
61226
d49f1310e23f Fix error handling removing files in test.support.unlink
Michael Foord <fuzzyman@voidspace.org.uk>
parents: 61163
diff changeset
606
64139
0ed76c7b9847 Improve PEP 383 tests (in test_os)
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64110
diff changeset
607 # 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
608 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
609 if sys.platform == 'darwin':
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
610 # 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
611 # 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
612 # 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
613 import unicodedata
df961064f811 Decompose TESTFN_UNICODE on Mac OS X
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64139
diff changeset
614 TESTFN_UNICODE = unicodedata.normalize('NFD', TESTFN_UNICODE)
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
615 TESTFN_ENCODING = sys.getfilesystemencoding()
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
616
63960
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
617 # 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
618 # 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
619 # 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
620 TESTFN_UNENCODABLE = None
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
621 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
622 # 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
623 if sys.getwindowsversion().platform >= 2:
64603
c20de96a435a Merged revisions 84666 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 64541
diff changeset
624 # 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
625 # 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
626 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
627 try:
63960
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
628 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
629 except UnicodeEncodeError:
0d81a656412a Rename checks for test_support.have_unicode (we always
Walter Dörwald <walter@livinglogic.de>
parents: 41716
diff changeset
630 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
631 else:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
632 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
633 '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
634 % (TESTFN_UNENCODABLE, TESTFN_ENCODING))
291c9afab12c Fix a typo: TESTFN_UNENCODEABLE => TESTFN_UNENCODABLE
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63948
diff changeset
635 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
636 # 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
637 elif sys.platform != 'darwin':
54967
8f23bd1092fc Merged revisions 73072 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54554
diff changeset
638 try:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
639 # 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
640 b'\xff'.decode(TESTFN_ENCODING)
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
641 except UnicodeDecodeError:
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
642 # 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
643 TESTFN_UNENCODABLE = TESTFN \
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
644 + 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
645 else:
63944
87b2da840252 Set TESTFN_UNENCODEABLE on non-Windows OSes
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63727
diff changeset
646 # 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
647 # 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
648 pass
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
649
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
650 # Save the initial cwd
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
651 SAVEDCWD = os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
652
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
653 @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
654 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
655 """
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
656 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
657
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
658 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
659 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
660
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
661 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
662 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
663 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
664 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
665 """
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
666 saved_dir = os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
667 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
668 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
669 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
670 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
671 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
672 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
673 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
674 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
675 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
676 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
677 RuntimeWarning, stacklevel=3)
26000
83d21ea9457d Fix SF # 631066, running regrtest in user mode fails
Neal Norwitz <nnorwitz@gmail.com>
parents: 25982
diff changeset
678 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
679 os.chdir(path)
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
680 except OSError:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
681 if not quiet:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
682 raise
79086
0b60dcabf7e6 #15304: fix wrong warning message in test.support.temp_cwd().
Ezio Melotti <ezio.melotti@gmail.com>
parents: 78551
diff changeset
683 warnings.warn('tests may fail, unable to change the CWD to ' + path,
58931
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
684 RuntimeWarning, stacklevel=3)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
685 try:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
686 yield os.getcwd()
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
687 finally:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
688 os.chdir(saved_dir)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
689 if is_temporary:
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
690 rmtree(name)
4c0be37b46b0 Merged revisions 78136 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58684
diff changeset
691
17036
ad741745cb6c Oops. A RISCOS patch I forgot to check in.
Guido van Rossum <guido@python.org>
parents: 16723
diff changeset
692
71465
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
693 if hasattr(os, "umask"):
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
694 @contextlib.contextmanager
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
695 def temp_umask(umask):
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
696 """Context manager that temporarily sets the process umask."""
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
697 oldmask = os.umask(umask)
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
698 try:
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
699 yield
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
700 finally:
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
701 os.umask(oldmask)
60648
7b69e630d237 PEP 3147
Barry Warsaw <barry@python.org>
parents: 60517
diff changeset
702
17036
ad741745cb6c Oops. A RISCOS patch I forgot to check in.
Guido van Rossum <guido@python.org>
parents: 16723
diff changeset
703
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
704 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
705 """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
706 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
707 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
708 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
709 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
710 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
711 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
712 path = sys.path
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
713 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
714 for dn in path:
07f24261c6e6 Make reindent.py happy (convert everything to 4-space indents!).
Fred Drake <fdrake@acm.org>
parents: 13682
diff changeset
715 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
716 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
717 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
718
71103
0c49260e85a0 Issue #12451: Add support.create_empty_file()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71073
diff changeset
719 def create_empty_file(filename):
0c49260e85a0 Issue #12451: Add support.create_empty_file()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71073
diff changeset
720 """Create an empty file. If the file already exists, truncate it."""
0c49260e85a0 Issue #12451: Add support.create_empty_file()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71073
diff changeset
721 fd = os.open(filename, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
0c49260e85a0 Issue #12451: Add support.create_empty_file()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71073
diff changeset
722 os.close(fd)
0c49260e85a0 Issue #12451: Add support.create_empty_file()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 71073
diff changeset
723
17815
d6df8d371b67 Get rid of the superstitious "~" in dict hashing's "i = (~hash) & mask".
Tim Peters <tim.peters@gmail.com>
parents: 17213
diff changeset
724 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
725 "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
726 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
727 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
728 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
729 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
730
50915
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
731 def make_bad_fd():
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
732 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
733 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
734 its fd.
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
735 """
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
736 file = open(TESTFN, "wb")
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
737 try:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
738 return file.fileno()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
739 finally:
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
740 file.close()
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
741 unlink(TESTFN)
af36ba123c1d Merged revisions 68782 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49533
diff changeset
742
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39644
diff changeset
743 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
744 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
745 '<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
746
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
747 def open_urlresource(url, *args, **kw):
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
748 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
749
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
750 check = kw.pop('check', None)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
751
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47322
diff changeset
752 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
753
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
754 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
755
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
756 def check_valid_file(fn):
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
757 f = open(fn, *args, **kw)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
758 if check is None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
759 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
760 elif check(f):
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
761 f.seek(0)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
762 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
763 f.close()
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
764
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
765 if os.path.exists(fn):
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
766 f = check_valid_file(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
767 if f is not None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
768 return f
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
769 unlink(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
770
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
771 # 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
772 requires('urlfetch')
35998
96d1fa36964d Patch #1276356: Implement new resource "urlfetch" for regrtest.
Hye-Shik Chang <hyeshik@gmail.com>
parents: 34707
diff changeset
773
40775
4cdf21a0dbbc Fix most trivially-findable print statements.
Guido van Rossum <guido@python.org>
parents: 40742
diff changeset
774 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
775 f = urllib.request.urlopen(url, timeout=15)
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
776 try:
57055
fd0542716a80 Merged revisions 76037 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56981
diff changeset
777 with open(fn, "wb") as out:
57056
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
778 s = f.read()
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
779 while s:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
780 out.write(s)
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
781 s = f.read()
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
782 finally:
b591fc8721f2 Merged revisions 76040 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56949
diff changeset
783 f.close()
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
784
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
785 f = check_valid_file(fn)
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
786 if f is not None:
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
787 return f
71343
cdb0ae616d58 Always use repr for regrtest resources names
Éric Araujo <merwok@netwok.org>
parents: 71331
diff changeset
788 raise TestFailed('invalid resource %r' % fn)
59720
8a28be45c242 Merged revisions 78982,78986 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59684
diff changeset
789
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
790
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
791 class WarningsRecorder(object):
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
792 """Convenience wrapper for the warnings list returned on
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
793 entry to the warnings.catch_warnings() context manager.
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
794 """
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
795 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
796 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
797 self._last = 0
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
798
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
799 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
800 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
801 return getattr(self._warnings[-1], attr)
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
802 elif attr in warnings.WarningMessage._WARNING_DETAILS:
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
803 return None
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
804 raise AttributeError("%r has no attribute %r" % (self, attr))
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
805
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
806 @property
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
807 def warnings(self):
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
808 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
809
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
810 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
811 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
812
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
813
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
814 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
815 """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
816 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
817 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
818 """
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
819 # 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
820 # 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
821 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
822 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
823 if registry:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
824 registry.clear()
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
825 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
826 # 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
827 # 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
828 # 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
829 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
830 yield WarningsRecorder(w)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
831 # Filter the recorded warnings
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
832 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
833 missing = []
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
834 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
835 seen = False
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
836 for w in reraise[:]:
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
837 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
838 # Filter out the matching messages
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
839 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
840 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
841 seen = True
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
842 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
843 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
844 # 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
845 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
846 if reraise:
65712
cf1d27321c78 Make check_warnings error messages more informative
Antoine Pitrou <solipsis@pitrou.net>
parents: 65316
diff changeset
847 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
848 if missing:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
849 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
850 missing[0])
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
851
49533
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
852
ca72271c624c forward port r66386
Benjamin Peterson <benjamin@python.org>
parents: 48952
diff changeset
853 @contextlib.contextmanager
59588
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
854 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
855 """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
856
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
857 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
858 ("message regexp", WarningCategory)
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
859
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
860 Optional argument:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
861 - 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
862 (default True without argument,
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
863 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
864
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
865 Without argument, it defaults to:
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
866 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
867 """
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
868 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
869 if not filters:
6774e8c6c39f Only the parts which are relevant for 3.x branch.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 58931
diff changeset
870 filters = (("", Warning),)
59684
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
871 # Preserve backward compatibility
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
872 if quiet is None:
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
873 quiet = True
485fe20dab12 Merged revisions 79049 via svnmerge from
Florent Xicluna <florent.xicluna@gmail.com>
parents: 59654
diff changeset
874 return _filterwarnings(filters, quiet)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
875
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
876
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
877 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
878 """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
879
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
880 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
881 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
882
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
883 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
884
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
885 with CleanImport("foo"):
58684
fba1c78f104e Merged revisions 77956-77957 via svnmerge from
Brett Cannon <bcannon@gmail.com>
parents: 58476
diff changeset
886 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
887 """
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
888
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
889 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
890 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
891 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
892 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
893 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
894 # 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
895 # 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
896 # 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
897 # 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
898 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
899 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
900 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
901
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
902 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
903 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
904
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
905 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
906 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
907
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
908
68112
7f8da10bfcef Fix imports from collections.abc
Raymond Hettinger <python@rcn.com>
parents: 68094
diff changeset
909 class EnvironmentVarGuard(collections.abc.MutableMapping):
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
910
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
911 """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
912 a context manager."""
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
913
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
914 def __init__(self):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
915 self._environ = os.environ
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
916 self._changed = {}
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
917
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
918 def __getitem__(self, envvar):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
919 return self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
920
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
921 def __setitem__(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
922 # 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
923 if envvar not in self._changed:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
924 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
925 self._environ[envvar] = value
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
926
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
927 def __delitem__(self, envvar):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
928 # 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
929 if envvar not in self._changed:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
930 self._changed[envvar] = self._environ.get(envvar)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
931 if envvar in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
932 del self._environ[envvar]
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
933
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
934 def keys(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
935 return self._environ.keys()
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
936
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
937 def __iter__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
938 return iter(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
939
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
940 def __len__(self):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
941 return len(self._environ)
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
942
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
943 def set(self, envvar, value):
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
944 self[envvar] = value
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
945
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
946 def unset(self, envvar):
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
947 del self[envvar]
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
948
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
949 def __enter__(self):
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
950 return self
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
951
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
952 def __exit__(self, *ignore_exc):
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
953 for (k, v) in self._changed.items():
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
954 if v is None:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
955 if k in self._environ:
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
956 del self._environ[k]
53387
d35337f65015 Merged revisions 71875 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53317
diff changeset
957 else:
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
958 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
959 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
960
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
961
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
962 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
963 """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
964
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
965 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
966 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
967 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
968
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
969 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
970 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
971 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
972 """
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
973
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
974 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
975 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
976 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
977 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
978
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
979 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
980 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
981
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
982 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
983 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
984 sys.path[:] = self.original_value
53646
5c55b9c80846 Merged revisions 72167 via svnmerge from
Walter Dörwald <walter@livinglogic.de>
parents: 53487
diff changeset
985
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40450
diff changeset
986
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
987 class TransientResource(object):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
988
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
989 """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
990 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
991
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
992 def __init__(self, exc, **kwargs):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
993 self.exc = exc
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
994 self.attrs = kwargs
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
995
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
996 def __enter__(self):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
997 return self
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
998
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
999 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
1000 """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
1001 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
1002 propagate (if any)."""
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1003 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
1004 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
1005 if not hasattr(value, attr):
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1006 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1007 if getattr(value, attr) != attr_value:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1008 break
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1009 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1010 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
1011
54553
287887198e2f Use new form of with-statement instead of contextlib.nested().
Raymond Hettinger <python@rcn.com>
parents: 54504
diff changeset
1012 # 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
1013 # 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
1014 # 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
1015 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
1016 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
1017 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
1018
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1019
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
1020 @contextlib.contextmanager
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1021 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
1022 """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
1023 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
1024 default_errnos = [
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1025 ('ECONNREFUSED', 111),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1026 ('ECONNRESET', 104),
67467
abe201dfd3dc Merged revisions 87861,87863 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67311
diff changeset
1027 ('EHOSTUNREACH', 113),
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1028 ('ENETUNREACH', 101),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1029 ('ETIMEDOUT', 110),
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1030 ]
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1031 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
1032 ('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
1033 ('EAI_FAIL', -4),
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1034 ('EAI_NONAME', -2),
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1035 ('EAI_NODATA', -5),
69676
89ebde7cd8ea Add WSANO_DATA to possible errors triggered by getaddrinfo (Windows)
Antoine Pitrou <solipsis@pitrou.net>
parents: 68545
diff changeset
1036 # 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
1037 ('WSANO_DATA', 11004),
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1038 ]
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1039
71343
cdb0ae616d58 Always use repr for regrtest resources names
Éric Araujo <merwok@netwok.org>
parents: 71331
diff changeset
1040 denied = ResourceDenied("Resource %r is not available" % resource_name)
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1041 captured_errnos = errnos
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1042 gai_errnos = []
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1043 if not captured_errnos:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1044 captured_errnos = [getattr(errno, name, num)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1045 for (name, num) in default_errnos]
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1046 gai_errnos = [getattr(socket, name, num)
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1047 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
1048
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1049 def filter_error(err):
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1050 n = getattr(err, 'errno', None)
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1051 if (isinstance(err, socket.timeout) or
64541
4c64e688f665 Merged revisions 84604 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64536
diff changeset
1052 (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
1053 n in captured_errnos):
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1054 if not verbose:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1055 sys.stderr.write(denied.args[0] + "\n")
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1056 raise denied from err
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1057
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1058 old_timeout = socket.getdefaulttimeout()
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1059 try:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1060 if timeout is not None:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1061 socket.setdefaulttimeout(timeout)
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
1062 yield
64536
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1063 except IOError as err:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1064 # 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
1065 # unwrap to get at the original error.
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1066 while True:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1067 a = err.args
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1068 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
1069 err = a[0]
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1070 # 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
1071 # except socket.error as msg:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1072 # 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
1073 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
1074 err = a[1]
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1075 else:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1076 break
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1077 filter_error(err)
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1078 raise
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1079 # 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
1080 # __cause__ or __context__?
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1081 finally:
2400f55ea312 Merged revisions 84597-84599 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63005
diff changeset
1082 socket.setdefaulttimeout(old_timeout)
60818
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
1083
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
1084
a0b8af1be560 Merged revisions 80317 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 58492
diff changeset
1085 @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
1086 def captured_output(stream_name):
70097
b2bcddfb8b18 Update __all__ and docstring.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70090
diff changeset
1087 """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
1088 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
1089 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
1090 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
1091 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
1092 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
1093 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
1094 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
1095 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
1096
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
1097 def captured_stdout():
70089
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
1098 """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
1099
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
1100 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
1101 print("hello")
c2126d89c29b #7960: fix docstrings for captured_output and captured_stdout.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70085
diff changeset
1102 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
1103 """
46262
f547ebf02843 Merged revisions 62090-62091,62096,62100,62102,62110-62114 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 45515
diff changeset
1104 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
1105
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
1106 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
1107 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
1108
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
1109 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
1110 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
1111
70097
b2bcddfb8b18 Update __all__ and docstring.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 70090
diff changeset
1112
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
1113 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
1114 """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
1115
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
1116 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
1117 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
1118 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
1119 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
1120 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
1121 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
1122 """
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
1123 gc.collect()
60517
b4f60df31b14 Merged revisions 79934 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59720
diff changeset
1124 if is_jython:
b4f60df31b14 Merged revisions 79934 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59720
diff changeset
1125 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
1126 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
1127 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
1128
71331
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1129 @contextlib.contextmanager
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1130 def disable_gc():
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1131 have_gc = gc.isenabled()
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1132 gc.disable()
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1133 try:
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1134 yield
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1135 finally:
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1136 if have_gc:
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1137 gc.enable()
527a52d682f6 add a contextmanager to disable the gc
Benjamin Peterson <benjamin@python.org>
parents: 71270
diff changeset
1138
42954
27f0289b6835 Merge the trunk changes in. Breaks socket.ssl for now.
Thomas Wouters <thomas@python.org>
parents: 42632
diff changeset
1139
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1140 def python_is_optimized():
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1141 """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
1142 cflags = sysconfig.get_config_var('PY_CFLAGS') or ''
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1143 final_opt = ""
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1144 for opt in cflags.split():
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1145 if opt.startswith('-O'):
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1146 final_opt = opt
71465
be558ad15789 Issue #11049: adding some tests to test.support
Eli Bendersky <eliben@gmail.com>
parents: 71368
diff changeset
1147 return final_opt != '' and final_opt != '-O0'
65725
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1148
765d421d943c make gdb skip expected
Benjamin Peterson <benjamin@python.org>
parents: 65712
diff changeset
1149
78316
d43ff8eb4cb3 Issue #15467: Merge 3.2
Martin v. Löwis <martin@v.loewis.de>
parents: 77978 78315
diff changeset
1150 _header = 'nP'
d43ff8eb4cb3 Issue #15467: Merge 3.2
Martin v. Löwis <martin@v.loewis.de>
parents: 77978 78315
diff changeset
1151 _align = '0n'
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1152 if hasattr(sys, "gettotalrefcount"):
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1153 _header = '2P' + _header
78316
d43ff8eb4cb3 Issue #15467: Merge 3.2
Martin v. Löwis <martin@v.loewis.de>
parents: 77978 78315
diff changeset
1154 _align = '0P'
d43ff8eb4cb3 Issue #15467: Merge 3.2
Martin v. Löwis <martin@v.loewis.de>
parents: 77978 78315
diff changeset
1155 _vheader = _header + 'n'
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1156
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1157 def calcobjsize(fmt):
78316
d43ff8eb4cb3 Issue #15467: Merge 3.2
Martin v. Löwis <martin@v.loewis.de>
parents: 77978 78315
diff changeset
1158 return struct.calcsize(_header + fmt + _align)
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1159
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1160 def calcvobjsize(fmt):
78316
d43ff8eb4cb3 Issue #15467: Merge 3.2
Martin v. Löwis <martin@v.loewis.de>
parents: 77978 78315
diff changeset
1161 return struct.calcsize(_vheader + fmt + _align)
78315
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1162
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1163
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1164 _TPFLAGS_HAVE_GC = 1<<14
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1165 _TPFLAGS_HEAPTYPE = 1<<9
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1166
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1167 def check_sizeof(test, o, size):
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1168 result = sys.getsizeof(o)
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1169 # add GC header size
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1170 if ((type(o) == type) and (o.__flags__ & _TPFLAGS_HEAPTYPE) or\
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1171 ((type(o) != type) and (type(o).__flags__ & _TPFLAGS_HAVE_GC))):
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1172 size += _testcapi.SIZEOF_PYGC_HEAD
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1173 msg = 'wrong size for %s: got %d, expected %d' \
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1174 % (type(o), result, size)
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1175 test.assertEqual(result, size, msg)
efade142ef01 Issue #15467: Move helpers for __sizeof__ tests into test_support.
Martin v. Löwis <martin@v.loewis.de>
parents: 76651
diff changeset
1176
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1177 #=======================================================================
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1178 # 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
1179 # 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
1180
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1181 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
1182 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
1183 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
1184 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1185 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
1186 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
1187 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
1188 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
1189 # 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
1190 raise
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1191 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1192 # 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
1193 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
1194 else:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1195 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
1196 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1197 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
1198 break
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1199 except:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1200 pass
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1201
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1202 # 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
1203 try:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1204 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
1205 finally:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1206 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
1207 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
1208 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
1209 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
1210 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
1211 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
1212
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1213 #=======================================================================
76644
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1214 # 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
1215 # resetting it afterwards.
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1216
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1217 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
1218 def decorator(func):
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1219 def inner(*args, **kwds):
76651
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1220 try:
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1221 tzset = time.tzset
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1222 except AttributeError:
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1223 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
1224 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
1225 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
1226 else:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1227 orig_tz = None
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1228 os.environ['TZ'] = tz
76651
f23222d734bd fixed test_imaplib failure on Win
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 76644
diff changeset
1229 tzset()
76644
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1230
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1231 # 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
1232 try:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1233 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
1234 finally:
79626
332b93ce7bf9 compare singletons by identity not equality (closes #16712)
Benjamin Peterson <benjamin@python.org>
parents: 79087
diff changeset
1235 if orig_tz is None:
76644
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1236 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
1237 else:
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1238 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
1239 time.tzset()
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1240
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1241 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
1242 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
1243 return inner
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1244 return decorator
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1245
90b9781ccb5f Issue #10941: Fix imaplib.Internaldate2tuple to produce correct result near
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 75093
diff changeset
1246 #=======================================================================
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1247 # Big-memory-test support. Separate from 'resources' because memory use
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1248 # 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
1249
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1250 # 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
1251 # 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
1252 _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
1253 _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
1254 _2G = 2 * _1G
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1255 _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
1256
43100
4e6b4ba60c3b Remove the simple slicing API. All slicing is now done with slice objects.
Thomas Wouters <thomas@python.org>
parents: 43089
diff changeset
1257 MAX_Py_ssize_t = sys.maxsize
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1258
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1259 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
1260 global max_memuse
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1261 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
1262 sizes = {
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1263 '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
1264 '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
1265 '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
1266 '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
1267 }
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1268 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
1269 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
1270 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
1271 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
1272 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
1273 real_max_memuse = memlimit
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1274 if memlimit > MAX_Py_ssize_t:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1275 memlimit = MAX_Py_ssize_t
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1276 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
1277 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
1278 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
1279
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1280 class _MemoryWatchdog:
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1281 """An object which periodically watches the process' memory consumption
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1282 and prints it out.
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1283 """
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1284
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1285 def __init__(self):
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1286 self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid())
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1287 self.started = False
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1288
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1289 def start(self):
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1290 try:
75911
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1291 f = open(self.procfile, 'r')
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1292 except OSError as e:
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1293 warnings.warn('/proc not available for stats: {}'.format(e),
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1294 RuntimeWarning)
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1295 sys.stderr.flush()
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1296 return
75911
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1297
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1298 watchdog_script = findfile("memory_watchdog.py")
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1299 self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1300 stdin=f, stderr=subprocess.DEVNULL)
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1301 f.close()
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1302 self.started = True
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1303
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1304 def stop(self):
75911
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1305 if self.started:
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1306 self.mem_watchdog.terminate()
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1307 self.mem_watchdog.wait()
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1308
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1309
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1310 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
1311 """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
1312
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1313 '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
1314 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
1315 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
1316
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1317 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
1318 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
1319 """
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1320 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
1321 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
1322 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
1323 memuse = wrapper.memuse
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1324 if not real_max_memuse:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1325 maxsize = 5147
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1326 else:
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1327 maxsize = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1328
72119
babc90f3cbf4 Issue #11564: Avoid crashes when trying to pickle huge objects or containers
Antoine Pitrou <solipsis@pitrou.net>
parents: 71612
diff changeset
1329 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
1330 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
1331 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
1332 "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
1333 % (size * memuse / (1024 ** 3)))
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1334
75911
53a2488605e3 Issue #14154: Reimplement the bigmem test memory watchdog as a subprocess.
Charles-François Natali <neologix@free.fr>
parents: 75850
diff changeset
1335 if real_max_memuse and verbose:
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1336 print()
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1337 print(" ... expected peak memory use: {peak:.1f}G"
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1338 .format(peak=size * memuse / (1024 ** 3)))
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1339 watchdog = _MemoryWatchdog()
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1340 watchdog.start()
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1341 else:
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1342 watchdog = None
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1343
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1344 try:
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1345 return f(self, maxsize)
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1346 finally:
72645
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1347 if watchdog:
8eaa4c3f8633 Use the faulthandler module's infrastructure to write a GIL-less
Antoine Pitrou <solipsis@pitrou.net>
parents: 72643
diff changeset
1348 watchdog.stop()
72642
bf39434dd506 Start fixing test_bigmem:
Antoine Pitrou <solipsis@pitrou.net>
parents: 72119
diff changeset
1349
48850
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1350 wrapper.size = size
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1351 wrapper.memuse = memuse
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1352 return wrapper
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1353 return decorator
afb9808b0f30 Closes release blocker #3627.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48455
diff changeset
1354
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1355 def bigaddrspacetest(f):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1356 """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
1357 def wrapper(self):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1358 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
1359 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
1360 raise unittest.SkipTest(
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1361 "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
1362 else:
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1363 raise unittest.SkipTest(
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1364 "not enough memory: %.1fG minimum needed"
4430e4d63594 Merged revisions 87968,87971-87975 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 67467
diff changeset
1365 % (MAX_Py_ssize_t / (1024 ** 3)))
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1366 else:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1367 return f(self)
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1368 return wrapper
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1369
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36382
diff changeset
1370 #=======================================================================
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1371 # 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
1372
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
1373 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
1374 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
1375 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
1376 test(result)
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1377 return result
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1378
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
1379 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
1380 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
1381
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
1382 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
1383 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
1384 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
1385 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
1386 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
1387 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
1388 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
1389
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
1390 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
1391 """
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
1392 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
1393 """
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
1394 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
1395
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
1396 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
1397 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
1398 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
1399 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
1400 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
1401 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
1402 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
1403 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
1404 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
1405 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
1406 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
1407 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
1408
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
1409 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
1410 # 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
1411 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
1412 return ({'cpython': True}, False)
53487
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
1413 is_true = list(guards.values())[0]
5d4fc166a3d4 Fixed 2.x-ism.
Eric Smith <eric@trueblade.com>
parents: 53387
diff changeset
1414 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
1415 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
1416
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
1417 # 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
1418 # 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
1419 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
1420 """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
1421 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
1422 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
1423 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
1424 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
1425 """
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
1426 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
1427 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
1428
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
1429
68080
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1430 def no_tracing(func):
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1431 """Decorator to temporarily turn off tracing for the duration of a test."""
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1432 if not hasattr(sys, 'gettrace'):
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1433 return func
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1434 else:
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1435 @functools.wraps(func)
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1436 def wrapper(*args, **kwargs):
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1437 original_trace = sys.gettrace()
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1438 try:
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1439 sys.settrace(None)
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1440 return func(*args, **kwargs)
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1441 finally:
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1442 sys.settrace(original_trace)
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1443 return wrapper
614e32900ef7 Issue #10990: Prevent tests from clobbering a set trace function.
Brett Cannon <bcannon@gmail.com>
parents: 67569
diff changeset
1444
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1445
68094
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1446 def refcount_test(test):
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1447 """Decorator for tests which involve reference counting.
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1448
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1449 To start, the decorator does not run the test if is not run by CPython.
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1450 After that, any trace function is unset during the test to prevent
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1451 unexpected refcounts caused by the trace function.
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1452
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1453 """
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1454 return no_tracing(cpython_only(test))
7f85fbc16cae Issue #10992: make tests pass when run under coverage.
Brett Cannon <bcannon@gmail.com>
parents: 68080
diff changeset
1455
17109
7eb8b240dd6c Just import sys at the top instead of inside lots of functions.
Fred Drake <fdrake@acm.org>
parents: 17036
diff changeset
1456
71612
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1457 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
1458 """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
1459 newtests = []
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1460 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
1461 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
1462 _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
1463 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
1464 else:
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1465 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
1466 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
1467 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
1468
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1469 def _run_suite(suite):
19995
b07cb51d731c run_suite(): Oops, update a docstring.
Barry Warsaw <barry@python.org>
parents: 19994
diff changeset
1470 """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
1471 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
1472 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
1473 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
1474 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
1475 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
1476
17133
d0fd60c59aef Updated to latest PyUnit version (1.31 in PyUnit CVS); test_support.py
Steve Purcell <steve@pythonconsulting.com>
parents: 17109
diff changeset
1477 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
1478 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
1479 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
1480 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
1481 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
1482 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
1483 else:
56949
a795529b09c9 Merged revisions 75525,75530,75922 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 55594
diff changeset
1484 err = "multiple errors occurred"
a795529b09c9 Merged revisions 75525,75530,75922 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 55594
diff changeset
1485 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
1486 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
1487
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
1488
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1489 def run_unittest(*classes):
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1490 """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
1491 valid_types = (unittest.TestSuite, unittest.TestCase)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
1492 suite = unittest.TestSuite()
28917
1741af48fd9f Combine the functionality of test_support.run_unittest()
Walter Dörwald <walter@livinglogic.de>
parents: 28863
diff changeset
1493 for cls in classes:
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 43100
diff changeset
1494 if isinstance(cls, str):
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1495 if cls in sys.modules:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1496 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
1497 else:
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1498 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
1499 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
1500 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
1501 else:
3f214b39b4df run_unittest() to support TestCase instances as well as classes. Helps with doctests.
Raymond Hettinger <python@rcn.com>
parents: 29142
diff changeset
1502 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
1503 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
1504 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
1505 return True
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1506 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
1507 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
1508 return True
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1509 return False
5d7a2bd9a3d1 Issue #12626: In regrtest, allow to filter tests using a glob filter
Antoine Pitrou <solipsis@pitrou.net>
parents: 71487
diff changeset
1510 _filter_suite(suite, case_pred)
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40910
diff changeset
1511 _run_suite(suite)
28863
6d852ebff36f Factor out common boilerplate for test_support
Raymond Hettinger <python@rcn.com>
parents: 28799
diff changeset
1512
19994
ab6c14822de1 run_suite(): Factor this out of run_unittest() for tests that build
Barry Warsaw <barry@python.org>
parents: 19819
diff changeset
1513
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
1514 #=======================================================================
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
1515 # 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
1516
75850
7355550d5357 Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents: 75295
diff changeset
1517 def run_doctest(module, verbosity=None, optionflags=0):
20227
92f86436b6be SF bug [#467336] doctest failures w/ new-style classes.
Tim Peters <tim.peters@gmail.com>
parents: 20091
diff changeset
1518 """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
1519
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
1520 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
1521 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
1522 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
1523 """
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
1524
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
1525 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
1526
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
1527 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
1528 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
1529 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
1530 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
1531
75850
7355550d5357 Issue #7652: Integrate the decimal floating point libmpdec library to speed
Stefan Krah <skrah@bytereef.org>
parents: 75295
diff changeset
1532 f, t = doctest.testmod(module, verbose=verbosity, optionflags=optionflags)
71072
d8ba59de860a Issue #12400: test.support.run_doctest() doesn't change sys.stdout anymore
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70814
diff changeset
1533 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
1534 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
1535 if verbose:
45182
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1536 print('doctest (%s) ... %d tests with zero failures' %
8fec50a3859f Respect EOL 80.
Georg Brandl <georg@python.org>
parents: 43734
diff changeset
1537 (module.__name__, t))
29140
e57e22aa56a4 Provide a clue that the doctests have run.
Raymond Hettinger <python@rcn.com>
parents: 29066
diff changeset
1538 return f, t
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1539
57215
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1540
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1541 #=======================================================================
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1542 # Support for saving and restoring the imported modules.
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1543
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1544 def modules_setup():
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1545 return sys.modules.copy(),
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1546
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1547 def modules_cleanup(oldmodules):
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1548 # Encoders/decoders are registered permanently within the internal
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1549 # 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
1550 # 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
1551 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
1552 if k.startswith('encodings.')]
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1553 sys.modules.clear()
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1554 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
1555 # XXX: This kind of problem can affect more than just encodings. In particular
67528
Eric Smith <eric@trueblade.com>
parents: 67527
diff changeset
1556 # 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
1557 # 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
1558 # 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
1559 # 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
1560 # 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
1561 sys.modules.update(oldmodules)
357e39700489 Merged revisions 76240 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 57056
diff changeset
1562
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1563 #=======================================================================
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1564 # 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
1565
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1566 # 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
1567 # 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
1568 # 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
1569 # unregistered from the threading module.
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1570 # 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
1571 # __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
1572 # 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
1573
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1574 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
1575 if _thread:
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1576 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
1577 else:
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1578 return 1, ()
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1579
71365
6a221b6b81ee Try harder to reap dangling threads in test.support.reap_threads().
Antoine Pitrou <solipsis@pitrou.net>
parents: 71269
diff changeset
1580 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
1581 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
1582 return
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1583 _MAX_COUNT = 10
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1584 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
1585 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
1586 if values == original_values:
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1587 break
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1588 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
1589 gc_collect()
56981
6cf84e5a6dd7 Merged revisions 75958 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 56627
diff changeset
1590 # 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
1591
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
1592 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
1593 """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
1594 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
1595 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
1596 """
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1597 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
1598 return func
493bb4585e38 Merged revisions 80552-80556,80564-80566,80568-80571 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents: 60817
diff changeset
1599
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
1600 @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
1601 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
1602 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
1603 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
1604 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
1605 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
1606 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
1607 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
1608
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1609 def reap_children():
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1610 """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
1611 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
1612 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
1613 for refleaks.
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1614 """
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1615
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1616 # 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
1617 # 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
1618 if hasattr(os, 'waitpid'):
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1619 any_process = -1
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1620 while True:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1621 try:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1622 # 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
1623 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
1624 if pid == 0:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1625 break
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1626 except:
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1627 break
67311
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1628
59654
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1629 @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
1630 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
1631 """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
1632
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1633 Usage:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1634 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
1635 ...
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1636
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1637 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
1638 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
1639 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
1640 block.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1641 """
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1642 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
1643 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
1644 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
1645 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1646 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1647 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1648 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
1649 else:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1650 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
1651 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1652 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1653 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1654 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
1655
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1656 @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
1657 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
1658 """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
1659
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1660 Usage:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1661 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
1662 ...
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1663
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1664 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
1665 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
1666 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
1667 block.
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1668 """
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1669 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
1670 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
1671 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
1672 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1673 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1674 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1675 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
1676 else:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1677 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
1678 try:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1679 yield
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1680 finally:
aa632943b8bd Add some tests for ways users can change or shadow globals and builtins.
Collin Winter <collinw@gmail.com>
parents: 59601
diff changeset
1681 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
1682
67311
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1683 def strip_python_stderr(stderr):
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1684 """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
1685 emitted by the interpreter.
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1686
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1687 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
1688 of a subprocess.Popen object.
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1689 """
77428
d31e83497c5a Issue #13841: Make child processes exit using sys.exit() on Windows
Richard Oudkerk <shibturn@gmail.com>
parents: 77113
diff changeset
1690 stderr = re.sub(br"\[\d+ refs\]\r?\n?", b"", stderr).strip()
67311
e9a51d463579 Merged revisions 87695 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65317
diff changeset
1691 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
1692
65304
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1693 def args_from_interpreter_flags():
995c33e2263b Inherit interpreter flags in parallel testing
Antoine Pitrou <solipsis@pitrou.net>
parents: 65278
diff changeset
1694 """Return a list of command-line arguments reproducing the current
68531
07f5ec8fc014 Add warnings support to test.support.args_from_interpreter_flags().
Brett Cannon <brett@python.org>
parents: 68258
diff changeset
1695 settings in sys.flags and sys.warnoptions."""
77036
2034b3de1144 Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents: 77035
diff changeset
1696 return subprocess._args_from_interpreter_flags()
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
1697
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
1698 #============================================================
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
1699 # 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
1700 #============================================================
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
1701
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
1702 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
1703 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
1704 # 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
1705 # 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
1706 # 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
1707 # 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
1708 # 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
1709 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
1710 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
1711
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
1712 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
1713 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
1714
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
1715 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
1716 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
1717 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
1718
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
1719 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
1720 """
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
1721 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
1722 """
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
1723 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
1724 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
1725 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
1726 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
1727 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
1728 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
1729
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
1730 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
1731
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
1732 _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
1733
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
1734 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
1735 """
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
1736 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
1737
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
1738 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
1739 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
1740 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
1741 """
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
1742 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
1743 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
1744 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
1745 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
1746 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
1747 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
1748 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
1749 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
1750
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
1751 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
1752 """
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
1753 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
1754 """
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
1755 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
1756 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
1757 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
1758 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
1759 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
1760 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
1761 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
1762
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1763
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1764 _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
1765 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
1766 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
1767 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
1768 return _can_symlink
70698
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1769 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
1770 try:
70698
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1771 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
1772 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
1773 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
1774 can = False
70698
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1775 else:
3ac7f71696a1 test.support: can_symlink() removes the temporary symbolic link
Victor Stinner <victor.stinner@haypocalc.com>
parents: 70575
diff changeset
1776 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
1777 _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
1778 return can
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1779
5aa433a277f9 Fix #9333. The symlink function is always available now, raising OSError
Brian Curtin <brian.curtin@gmail.com>
parents: 66843
diff changeset
1780 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
1781 """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
1782 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
1783 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
1784 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
1785
76883
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1786 _can_xattr = None
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1787 def can_xattr():
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1788 global _can_xattr
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1789 if _can_xattr is not None:
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1790 return _can_xattr
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1791 if not hasattr(os, "setxattr"):
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1792 can = False
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1793 else:
77113
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
1794 tmp_fp, tmp_name = tempfile.mkstemp()
76883
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1795 try:
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1796 with open(TESTFN, "wb") as fp:
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1797 try:
77113
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
1798 # TESTFN & tempfile may use different file systems with
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
1799 # different capabilities
77597
27f9c26fdd8b Issue #14626: Large refactoring of functions / parameters in the os module.
Larry Hastings <larry@hastings.org>
parents: 77428
diff changeset
1800 os.setxattr(tmp_fp, b"user.test", b"")
27f9c26fdd8b Issue #14626: Large refactoring of functions / parameters in the os module.
Larry Hastings <larry@hastings.org>
parents: 77428
diff changeset
1801 os.setxattr(fp.fileno(), b"user.test", b"")
76883
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1802 # Kernels < 2.6.39 don't respect setxattr flags.
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1803 kernel_version = platform.release()
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1804 m = re.match("2.6.(\d{1,2})", kernel_version)
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1805 can = m is None or int(m.group(1)) >= 39
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1806 except OSError:
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1807 can = False
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1808 finally:
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1809 unlink(TESTFN)
77113
ab94ed2a8012 #14885: Make support.skip_unless_xattr check also tempfile
Hynek Schlawack <hs@ox.cx>
parents: 77036
diff changeset
1810 unlink(tmp_name)
76883
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1811 _can_xattr = can
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1812 return can
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1813
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1814 def skip_unless_xattr(test):
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1815 """Skip decorator for tests that require functional extended attributes"""
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1816 ok = can_xattr()
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1817 msg = "no non-broken extended attribute support"
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1818 return test if ok else unittest.skip(msg)(test)
85824b819bcb Issue #14082: shutil.copy2() now copies extended attributes, if possible.
Antoine Pitrou <solipsis@pitrou.net>
parents: 76682
diff changeset
1819
68544
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1820 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
1821 """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
1822
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1823 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
1824 '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
1825 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
1826
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1827 """
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1828 # 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
1829 # 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
1830 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
1831
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1832 # 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
1833 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
1834 try:
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1835 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
1836 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
1837 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
1838 else:
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1839 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
1840
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1841 # 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
1842 def cleanup():
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1843 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
1844 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
1845 else:
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1846 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
1847
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1848 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
1849
6b33aa811821 On behalf of Tarek: Issue #11501: disutils.archive_utils.make_zipfile no
Antoine Pitrou <solipsis@pitrou.net>
parents: 68054
diff changeset
1850 # 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
1851 setattr(object_to_patch, attr_name, new_value)