Commit 87a249c1 authored by Ezio Melotti's avatar Ezio Melotti

#11732: merge with 3.3.

parents df1d3c5c e1857d99
...@@ -405,6 +405,13 @@ The :mod:`test.support` module defines the following functions: ...@@ -405,6 +405,13 @@ The :mod:`test.support` module defines the following functions:
A decorator for running tests that require support for symbolic links. A decorator for running tests that require support for symbolic links.
.. function:: suppress_crash_popup()
A context manager that disables Windows Error Reporting dialogs using
`SetErrorMode <http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx>`_.
On other platforms it's a no-op.
.. decorator:: anticipate_failure(condition) .. decorator:: anticipate_failure(condition)
A decorator to conditionally mark tests with A decorator to conditionally mark tests with
......
...@@ -71,7 +71,7 @@ __all__ = [ ...@@ -71,7 +71,7 @@ __all__ = [
"TestHandler", "Matcher", "can_symlink", "skip_unless_symlink", "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
"skip_unless_xattr", "import_fresh_module", "requires_zlib", "skip_unless_xattr", "import_fresh_module", "requires_zlib",
"PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz", "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz",
"requires_bz2", "requires_lzma" "requires_bz2", "requires_lzma", "suppress_crash_popup",
] ]
class Error(Exception): class Error(Exception):
...@@ -1907,6 +1907,28 @@ def skip_unless_xattr(test): ...@@ -1907,6 +1907,28 @@ def skip_unless_xattr(test):
msg = "no non-broken extended attribute support" msg = "no non-broken extended attribute support"
return test if ok else unittest.skip(msg)(test) return test if ok else unittest.skip(msg)(test)
if sys.platform.startswith('win'):
@contextlib.contextmanager
def suppress_crash_popup():
"""Disable Windows Error Reporting dialogs using SetErrorMode."""
# see http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx
import ctypes
k32 = ctypes.windll.kernel32
old_error_mode = k32.GetErrorMode()
SEM_NOGPFAULTERRORBOX = 0x02
k32.SetErrorMode(old_error_mode | SEM_NOGPFAULTERRORBOX)
try:
yield
finally:
k32.SetErrorMode(old_error_mode)
else:
# this is a no-op for other platforms
@contextlib.contextmanager
def suppress_crash_popup():
yield
def patch(test_instance, object_to_patch, attr_name, new_value): def patch(test_instance, object_to_patch, attr_name, new_value):
"""Override 'object_to_patch'.'attr_name' with 'new_value'. """Override 'object_to_patch'.'attr_name' with 'new_value'.
......
...@@ -44,11 +44,12 @@ class CAPITest(unittest.TestCase): ...@@ -44,11 +44,12 @@ class CAPITest(unittest.TestCase):
@unittest.skipUnless(threading, 'Threading required for this test.') @unittest.skipUnless(threading, 'Threading required for this test.')
def test_no_FatalError_infinite_loop(self): def test_no_FatalError_infinite_loop(self):
p = subprocess.Popen([sys.executable, "-c", with support.suppress_crash_popup():
'import _testcapi;' p = subprocess.Popen([sys.executable, "-c",
'_testcapi.crash_no_current_thread()'], 'import _testcapi;'
stdout=subprocess.PIPE, '_testcapi.crash_no_current_thread()'],
stderr=subprocess.PIPE) stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(out, err) = p.communicate() (out, err) = p.communicate()
self.assertEqual(out, b'') self.assertEqual(out, b'')
# This used to cause an infinite loop. # This used to cause an infinite loop.
......
...@@ -101,7 +101,8 @@ class FaultHandlerTests(unittest.TestCase): ...@@ -101,7 +101,8 @@ class FaultHandlerTests(unittest.TestCase):
header=re.escape(header)) header=re.escape(header))
if other_regex: if other_regex:
regex += '|' + other_regex regex += '|' + other_regex
output, exitcode = self.get_output(code, filename) with support.suppress_crash_popup():
output, exitcode = self.get_output(code, filename)
output = '\n'.join(output) output = '\n'.join(output)
self.assertRegex(output, regex) self.assertRegex(output, regex)
self.assertNotEqual(exitcode, 0) self.assertNotEqual(exitcode, 0)
...@@ -229,7 +230,8 @@ faulthandler.disable() ...@@ -229,7 +230,8 @@ faulthandler.disable()
faulthandler._read_null() faulthandler._read_null()
""".strip() """.strip()
not_expected = 'Fatal Python error' not_expected = 'Fatal Python error'
stderr, exitcode = self.get_output(code) with support.suppress_crash_popup():
stderr, exitcode = self.get_output(code)
stder = '\n'.join(stderr) stder = '\n'.join(stderr)
self.assertTrue(not_expected not in stderr, self.assertTrue(not_expected not in stderr,
"%r is present in %r" % (not_expected, stderr)) "%r is present in %r" % (not_expected, stderr))
......
...@@ -892,6 +892,10 @@ Extension Modules ...@@ -892,6 +892,10 @@ Extension Modules
Tests Tests
----- -----
- Issue #11732: add a new suppress_crash_popup() context manager to test.support
that disables crash popups on Windows and use it in test_faulthandler and
test_ctypes.
- Issue #13898: test_ssl no longer prints a spurious stack trace on Ubuntu. - Issue #13898: test_ssl no longer prints a spurious stack trace on Ubuntu.
- Issue #17283: Share code between `__main__.py` and `regrtest.py` in - Issue #17283: Share code between `__main__.py` and `regrtest.py` in
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment