blob: 84931140b10286b67d257aa21da57ca2b5661741 [file] [log] [blame]
Victor Stinner234cbef2015-09-30 01:13:53 +02001import atexit
2import faulthandler
3import os
4import signal
5import sys
6import unittest
7from test import support
8try:
9 import gc
10except ImportError:
11 gc = None
12
Victor Stinner234cbef2015-09-30 01:13:53 +020013
Victor Stinnera2045022015-09-30 02:17:28 +020014def setup_tests(ns):
Victor Stinnerccef8232017-10-13 12:59:12 -070015 try:
16 stderr_fd = sys.__stderr__.fileno()
17 except (ValueError, AttributeError):
18 # Catch ValueError to catch io.UnsupportedOperation on TextIOBase
19 # and ValueError on a closed stream.
20 #
21 # Catch AttributeError for stderr being None.
22 stderr_fd = None
23 else:
24 # Display the Python traceback on fatal errors (e.g. segfault)
25 faulthandler.enable(all_threads=True, file=stderr_fd)
Victor Stinner234cbef2015-09-30 01:13:53 +020026
Victor Stinnerccef8232017-10-13 12:59:12 -070027 # Display the Python traceback on SIGALRM or SIGUSR1 signal
28 signals = []
29 if hasattr(signal, 'SIGALRM'):
30 signals.append(signal.SIGALRM)
31 if hasattr(signal, 'SIGUSR1'):
32 signals.append(signal.SIGUSR1)
33 for signum in signals:
34 faulthandler.register(signum, chain=True, file=stderr_fd)
Victor Stinner234cbef2015-09-30 01:13:53 +020035
36 replace_stdout()
37 support.record_original_stdout(sys.stdout)
38
Victor Stinner9759dd32016-03-30 02:32:52 +020039 if ns.testdir:
40 # Prepend test directory to sys.path, so runtest() will be able
41 # to locate tests
42 sys.path.insert(0, os.path.abspath(ns.testdir))
43
Victor Stinner234cbef2015-09-30 01:13:53 +020044 # Some times __path__ and __file__ are not absolute (e.g. while running from
45 # Lib/) and, if we change the CWD to run the tests in a temporary dir, some
46 # imports might fail. This affects only the modules imported before os.chdir().
47 # These modules are searched first in sys.path[0] (so '' -- the CWD) and if
48 # they are found in the CWD their __file__ and __path__ will be relative (this
49 # happens before the chdir). All the modules imported after the chdir, are
50 # not found in the CWD, and since the other paths in sys.path[1:] are absolute
51 # (site.py absolutize them), the __file__ and __path__ will be absolute too.
52 # Therefore it is necessary to absolutize manually the __file__ and __path__ of
53 # the packages to prevent later imports to fail when the CWD is different.
54 for module in sys.modules.values():
55 if hasattr(module, '__path__'):
Victor Stinner82f04e22016-03-15 23:08:44 +010056 for index, path in enumerate(module.__path__):
57 module.__path__[index] = os.path.abspath(path)
Ned Deilye52ac042018-03-28 01:57:13 -040058 if getattr(module, '__file__', None):
Victor Stinner234cbef2015-09-30 01:13:53 +020059 module.__file__ = os.path.abspath(module.__file__)
60
61 # MacOSX (a.k.a. Darwin) has a default stack size that is too small
62 # for deeply recursive regular expressions. We see this as crashes in
63 # the Python test suite when running test_re.py and test_sre.py. The
64 # fix is to set the stack limit to 2048.
65 # This approach may also be useful for other Unixy platforms that
66 # suffer from small default stack limits.
67 if sys.platform == 'darwin':
68 try:
69 import resource
70 except ImportError:
71 pass
72 else:
73 soft, hard = resource.getrlimit(resource.RLIMIT_STACK)
74 newsoft = min(hard, max(soft, 1024*2048))
75 resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
76
77 if ns.huntrleaks:
78 unittest.BaseTestSuite._cleanup = False
79
Victor Stinner234cbef2015-09-30 01:13:53 +020080 if ns.memlimit is not None:
81 support.set_memlimit(ns.memlimit)
82
83 if ns.threshold is not None:
84 gc.set_threshold(ns.threshold)
85
Steve Dower12c29452015-10-08 09:05:36 -070086 try:
Victor Stinner234cbef2015-09-30 01:13:53 +020087 import msvcrt
Steve Dower12c29452015-10-08 09:05:36 -070088 except ImportError:
89 pass
90 else:
Victor Stinner234cbef2015-09-30 01:13:53 +020091 msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS|
92 msvcrt.SEM_NOALIGNMENTFAULTEXCEPT|
93 msvcrt.SEM_NOGPFAULTERRORBOX|
94 msvcrt.SEM_NOOPENFILEERRORBOX)
95 try:
96 msvcrt.CrtSetReportMode
97 except AttributeError:
98 # release build
99 pass
100 else:
101 for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]:
Steve Dower12c29452015-10-08 09:05:36 -0700102 if ns.verbose and ns.verbose >= 2:
103 msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE)
104 msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR)
105 else:
106 msvcrt.CrtSetReportMode(m, 0)
Victor Stinner234cbef2015-09-30 01:13:53 +0200107
Victor Stinnera2045022015-09-30 02:17:28 +0200108 support.use_resources = ns.use_resources
109
Steve Dowerb82e17e2019-05-23 08:45:22 -0700110 if hasattr(sys, 'addaudithook'):
111 # Add an auditing hook for all tests to ensure PySys_Audit is tested
112 def _test_audit_hook(name, args):
113 pass
114 sys.addaudithook(_test_audit_hook)
115
Victor Stinner234cbef2015-09-30 01:13:53 +0200116
117def replace_stdout():
118 """Set stdout encoder error handler to backslashreplace (as stderr error
119 handler) to avoid UnicodeEncodeError when printing a traceback"""
120 stdout = sys.stdout
Victor Stinnerccef8232017-10-13 12:59:12 -0700121 try:
122 fd = stdout.fileno()
123 except ValueError:
124 # On IDLE, sys.stdout has no file descriptor and is not a TextIOWrapper
125 # object. Leaving sys.stdout unchanged.
126 #
127 # Catch ValueError to catch io.UnsupportedOperation on TextIOBase
128 # and ValueError on a closed stream.
129 return
130
131 sys.stdout = open(fd, 'w',
Victor Stinner234cbef2015-09-30 01:13:53 +0200132 encoding=stdout.encoding,
133 errors="backslashreplace",
134 closefd=False,
135 newline='\n')
136
137 def restore_stdout():
138 sys.stdout.close()
139 sys.stdout = stdout
140 atexit.register(restore_stdout)