blob: 13efdb45818b7da3afae845201256a86d37c940d [file] [log] [blame]
Victor Stinner4ffe9c22018-06-14 14:58:13 +02001import math
Victor Stinner4d299832019-04-26 04:08:53 +02002import os.path
3import sys
Victor Stinner7ad16eb2018-06-01 11:04:45 +02004import textwrap
Victor Stinner95f61c82019-06-13 01:09:04 +02005from test import support
Victor Stinner7ad16eb2018-06-01 11:04:45 +02006
7
8def format_duration(seconds):
Victor Stinner4ffe9c22018-06-14 14:58:13 +02009 ms = math.ceil(seconds * 1e3)
10 seconds, ms = divmod(ms, 1000)
11 minutes, seconds = divmod(seconds, 60)
12 hours, minutes = divmod(minutes, 60)
Victor Stinner7ad16eb2018-06-01 11:04:45 +020013
Victor Stinner4ffe9c22018-06-14 14:58:13 +020014 parts = []
Victor Stinner7ad16eb2018-06-01 11:04:45 +020015 if hours:
Victor Stinner4ffe9c22018-06-14 14:58:13 +020016 parts.append('%s hour' % hours)
17 if minutes:
18 parts.append('%s min' % minutes)
19 if seconds:
Victor Stinner098e2562019-10-03 16:15:16 +020020 if parts:
21 # 2 min 1 sec
22 parts.append('%s sec' % seconds)
23 else:
24 # 1.0 sec
25 parts.append('%.1f sec' % (seconds + ms / 1000))
Victor Stinner4ffe9c22018-06-14 14:58:13 +020026 if not parts:
Victor Stinner098e2562019-10-03 16:15:16 +020027 return '%s ms' % ms
Victor Stinner4ffe9c22018-06-14 14:58:13 +020028
29 parts = parts[:2]
30 return ' '.join(parts)
Victor Stinner7ad16eb2018-06-01 11:04:45 +020031
32
33def removepy(names):
34 if not names:
35 return
36 for idx, name in enumerate(names):
37 basename, ext = os.path.splitext(name)
38 if ext == '.py':
39 names[idx] = basename
40
41
42def count(n, word):
43 if n == 1:
44 return "%d %s" % (n, word)
45 else:
46 return "%d %ss" % (n, word)
47
48
49def printlist(x, width=70, indent=4, file=None):
50 """Print the elements of iterable x to stdout.
51
52 Optional arg width (default 70) is the maximum line length.
53 Optional arg indent (default 4) is the number of blanks with which to
54 begin each line.
55 """
56
57 blanks = ' ' * indent
58 # Print the sorted list: 'x' may be a '--random' list or a set()
59 print(textwrap.fill(' '.join(str(elt) for elt in sorted(x)), width,
60 initial_indent=blanks, subsequent_indent=blanks),
61 file=file)
Victor Stinner4d299832019-04-26 04:08:53 +020062
63
64def print_warning(msg):
Victor Stinnerd663d342020-04-23 19:03:52 +020065 support.print_warning(msg)
Victor Stinner95f61c82019-06-13 01:09:04 +020066
67
68orig_unraisablehook = None
69
70
71def regrtest_unraisable_hook(unraisable):
72 global orig_unraisablehook
73 support.environment_altered = True
74 print_warning("Unraisable exception")
Victor Stinner701b6382020-08-03 22:51:23 +020075 old_stderr = sys.stderr
76 try:
77 sys.stderr = sys.__stderr__
78 orig_unraisablehook(unraisable)
79 finally:
80 sys.stderr = old_stderr
Victor Stinner95f61c82019-06-13 01:09:04 +020081
82
83def setup_unraisable_hook():
84 global orig_unraisablehook
85 orig_unraisablehook = sys.unraisablehook
86 sys.unraisablehook = regrtest_unraisable_hook
Victor Stinner10417dd2021-03-23 00:17:05 +010087
88
89def clear_caches():
90 # Clear the warnings registry, so they can be displayed again
91 for mod in sys.modules.values():
92 if hasattr(mod, '__warningregistry__'):
93 del mod.__warningregistry__
94
95 # Flush standard output, so that buffered data is sent to the OS and
96 # associated Python objects are reclaimed.
97 for stream in (sys.stdout, sys.stderr, sys.__stdout__, sys.__stderr__):
98 if stream is not None:
99 stream.flush()
100
101 # Clear assorted module caches.
102 # Don't worry about resetting the cache if the module is not loaded
103 try:
104 distutils_dir_util = sys.modules['distutils.dir_util']
105 except KeyError:
106 pass
107 else:
108 distutils_dir_util._path_created.clear()
109
110 try:
111 re = sys.modules['re']
112 except KeyError:
113 pass
114 else:
115 re.purge()
116
117 try:
118 _strptime = sys.modules['_strptime']
119 except KeyError:
120 pass
121 else:
122 _strptime._regex_cache.clear()
123
124 try:
125 urllib_parse = sys.modules['urllib.parse']
126 except KeyError:
127 pass
128 else:
129 urllib_parse.clear_cache()
130
131 try:
132 urllib_request = sys.modules['urllib.request']
133 except KeyError:
134 pass
135 else:
136 urllib_request.urlcleanup()
137
138 try:
139 linecache = sys.modules['linecache']
140 except KeyError:
141 pass
142 else:
143 linecache.clearcache()
144
145 try:
146 mimetypes = sys.modules['mimetypes']
147 except KeyError:
148 pass
149 else:
150 mimetypes._default_mime_types()
151
152 try:
153 filecmp = sys.modules['filecmp']
154 except KeyError:
155 pass
156 else:
157 filecmp._cache.clear()
158
159 try:
160 struct = sys.modules['struct']
161 except KeyError:
162 pass
163 else:
164 struct._clearcache()
165
166 try:
167 doctest = sys.modules['doctest']
168 except KeyError:
169 pass
170 else:
171 doctest.master = None
172
173 try:
174 ctypes = sys.modules['ctypes']
175 except KeyError:
176 pass
177 else:
178 ctypes._reset_cache()
179
180 try:
181 typing = sys.modules['typing']
182 except KeyError:
183 pass
184 else:
185 for f in typing._cleanups:
186 f()
187
188 support.gc_collect()