Skip to content

Commit c7a6c7b

Browse files
authored
bpo-40826: Fix test_repl.test_close_stdin() on Windows (GH-20779) (GH-20785) (GH-20787)
test_repl.test_close_stdin() now calls support.suppress_msvcrt_asserts() to fix the test on Windows. * Move suppress_msvcrt_asserts() from test.libregrtest.setup to test.support. Make its verbose parameter optional: verbose=False by default. * SuppressCrashReport now uses SetErrorMode() of the msvcrt module, rather than using ctypes. * Remove also an unused variable (deadline) in wait_process(). (cherry picked from commit f6e58ae) (cherry picked from commit 4a4f660)
1 parent 663836e commit c7a6c7b

File tree

4 files changed

+42
-45
lines changed

4 files changed

+42
-45
lines changed

Lib/test/audit-tests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,9 @@ def hook(event, args):
350350

351351

352352
if __name__ == "__main__":
353-
from test.libregrtest.setup import suppress_msvcrt_asserts
353+
from test.support import suppress_msvcrt_asserts
354354

355-
suppress_msvcrt_asserts(False)
355+
suppress_msvcrt_asserts()
356356

357357
test = sys.argv[1]
358358
globals()[test]()

Lib/test/libregrtest/setup.py

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def setup_tests(ns):
6767
if ns.threshold is not None:
6868
gc.set_threshold(ns.threshold)
6969

70-
suppress_msvcrt_asserts(ns.verbose and ns.verbose >= 2)
70+
support.suppress_msvcrt_asserts(ns.verbose and ns.verbose >= 2)
7171

7272
support.use_resources = ns.use_resources
7373

@@ -78,31 +78,6 @@ def _test_audit_hook(name, args):
7878
sys.addaudithook(_test_audit_hook)
7979

8080

81-
def suppress_msvcrt_asserts(verbose):
82-
try:
83-
import msvcrt
84-
except ImportError:
85-
return
86-
87-
msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS|
88-
msvcrt.SEM_NOALIGNMENTFAULTEXCEPT|
89-
msvcrt.SEM_NOGPFAULTERRORBOX|
90-
msvcrt.SEM_NOOPENFILEERRORBOX)
91-
try:
92-
msvcrt.CrtSetReportMode
93-
except AttributeError:
94-
# release build
95-
return
96-
97-
for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]:
98-
if verbose:
99-
msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE)
100-
msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR)
101-
else:
102-
msvcrt.CrtSetReportMode(m, 0)
103-
104-
105-
10681
def replace_stdout():
10782
"""Set stdout encoder error handler to backslashreplace (as stderr error
10883
handler) to avoid UnicodeEncodeError when printing a traceback"""

Lib/test/support/__init__.py

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2825,6 +2825,27 @@ def test__all__(self):
28252825
test_case.assertCountEqual(module.__all__, expected)
28262826

28272827

2828+
def suppress_msvcrt_asserts(verbose=False):
2829+
try:
2830+
import msvcrt
2831+
except ImportError:
2832+
return
2833+
2834+
msvcrt.SetErrorMode(msvcrt.SEM_FAILCRITICALERRORS
2835+
| msvcrt.SEM_NOALIGNMENTFAULTEXCEPT
2836+
| msvcrt.SEM_NOGPFAULTERRORBOX
2837+
| msvcrt.SEM_NOOPENFILEERRORBOX)
2838+
2839+
# CrtSetReportMode() is only available in debug build
2840+
if hasattr(msvcrt, 'CrtSetReportMode'):
2841+
for m in [msvcrt.CRT_WARN, msvcrt.CRT_ERROR, msvcrt.CRT_ASSERT]:
2842+
if verbose:
2843+
msvcrt.CrtSetReportMode(m, msvcrt.CRTDBG_MODE_FILE)
2844+
msvcrt.CrtSetReportFile(m, msvcrt.CRTDBG_FILE_STDERR)
2845+
else:
2846+
msvcrt.CrtSetReportMode(m, 0)
2847+
2848+
28282849
class SuppressCrashReport:
28292850
"""Try to prevent a crash report from popping up.
28302851
@@ -2836,7 +2857,7 @@ class SuppressCrashReport:
28362857

28372858
def __enter__(self):
28382859
"""On Windows, disable Windows Error Reporting dialogs using
2839-
SetErrorMode.
2860+
SetErrorMode() and CrtSetReportMode().
28402861
28412862
On UNIX, try to save the previous core file size limit, then set
28422863
soft limit to 0.
@@ -2845,21 +2866,18 @@ def __enter__(self):
28452866
# see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621.aspx
28462867
# GetErrorMode is not available on Windows XP and Windows Server 2003,
28472868
# but SetErrorMode returns the previous value, so we can use that
2848-
import ctypes
2849-
self._k32 = ctypes.windll.kernel32
2850-
SEM_NOGPFAULTERRORBOX = 0x02
2851-
self.old_value = self._k32.SetErrorMode(SEM_NOGPFAULTERRORBOX)
2852-
self._k32.SetErrorMode(self.old_value | SEM_NOGPFAULTERRORBOX)
2853-
2854-
# Suppress assert dialogs in debug builds
2855-
# (see http://bugs.python.org/issue23314)
28562869
try:
28572870
import msvcrt
2858-
msvcrt.CrtSetReportMode
2859-
except (AttributeError, ImportError):
2860-
# no msvcrt or a release build
2861-
pass
2862-
else:
2871+
except ImportError:
2872+
return
2873+
2874+
self.old_value = msvcrt.SetErrorMode(msvcrt.SEM_NOGPFAULTERRORBOX)
2875+
2876+
msvcrt.SetErrorMode(self.old_value | msvcrt.SEM_NOGPFAULTERRORBOX)
2877+
2878+
# bpo-23314: Suppress assert dialogs in debug builds.
2879+
# CrtSetReportMode() is only available in debug build.
2880+
if hasattr(msvcrt, 'CrtSetReportMode'):
28632881
self.old_modes = {}
28642882
for report_type in [msvcrt.CRT_WARN,
28652883
msvcrt.CRT_ERROR,
@@ -2905,10 +2923,10 @@ def __exit__(self, *ignore_exc):
29052923
return
29062924

29072925
if sys.platform.startswith('win'):
2908-
self._k32.SetErrorMode(self.old_value)
2926+
import msvcrt
2927+
msvcrt.SetErrorMode(self.old_value)
29092928

29102929
if self.old_modes:
2911-
import msvcrt
29122930
for report_type, (old_mode, old_file) in self.old_modes.items():
29132931
msvcrt.CrtSetReportMode(report_type, old_mode)
29142932
msvcrt.CrtSetReportFile(report_type, old_file)

Lib/test/test_repl.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ def test_close_stdin(self):
9898
print("before close")
9999
os.close(0)
100100
''')
101-
process = spawn_repl()
101+
prepare_repl = dedent('''
102+
from test.support import suppress_msvcrt_asserts
103+
suppress_msvcrt_asserts()
104+
''')
105+
process = spawn_repl('-c', prepare_repl)
102106
output = process.communicate(user_input)[0]
103107
self.assertEqual(process.returncode, 0)
104108
self.assertIn('before close', output)

0 commit comments

Comments
 (0)