From 25a404520da6c2560690e457404ea36f4aaa9344 Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Tue, 5 Mar 2013 20:26:17 +0200 Subject: [PATCH] #11732: add a new suppress_crash_popup() context manager to test.support. --- Doc/library/test.rst | 7 +++++++ Lib/test/support.py | 24 +++++++++++++++++++++++- Lib/test/test_capi.py | 3 ++- Lib/test/test_faulthandler.py | 6 ++++-- Misc/NEWS | 4 ++++ 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 940d3e744e8..702ef8ac428 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -405,6 +405,13 @@ The :mod:`test.support` module defines the following functions: 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 `_. + On other platforms it's a no-op. + + .. decorator:: anticipate_failure(condition) A decorator to conditionally mark tests with diff --git a/Lib/test/support.py b/Lib/test/support.py index d89e172d3d4..ba1206cbb45 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -71,7 +71,7 @@ __all__ = [ "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink", "skip_unless_xattr", "import_fresh_module", "requires_zlib", "PIPE_MAX_SIZE", "failfast", "anticipate_failure", "run_with_tz", - "requires_bz2", "requires_lzma" + "requires_bz2", "requires_lzma", "suppress_crash_popup", ] class Error(Exception): @@ -1905,6 +1905,28 @@ def skip_unless_xattr(test): msg = "no non-broken extended attribute support" 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): """Override 'object_to_patch'.'attr_name' with 'new_value'. diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 65778be501b..c0c8a12ac0e 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -44,7 +44,8 @@ class CAPITest(unittest.TestCase): @unittest.skipUnless(threading, 'Threading required for this test.') def test_no_FatalError_infinite_loop(self): - p = subprocess.Popen([sys.executable, "-c", + with support.suppress_crash_popup(): + p = subprocess.Popen([sys.executable, "-c", 'import _testcapi;' '_testcapi.crash_no_current_thread()'], stdout=subprocess.PIPE, diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index b81b34d3ef0..4e6d9bc2ad1 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -101,7 +101,8 @@ class FaultHandlerTests(unittest.TestCase): header=re.escape(header)) if 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) self.assertRegex(output, regex) self.assertNotEqual(exitcode, 0) @@ -229,7 +230,8 @@ faulthandler.disable() faulthandler._read_null() """.strip() 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) self.assertTrue(not_expected not in stderr, "%r is present in %r" % (not_expected, stderr)) diff --git a/Misc/NEWS b/Misc/NEWS index 5bc17841cda..36650016992 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -640,6 +640,10 @@ Library 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 #17249: convert a test in test_capi to use unittest and reap threads.