]> granicus.if.org Git - python/commitdiff
#11732: add a new suppress_crash_popup() context manager to test.support.
authorEzio Melotti <ezio.melotti@gmail.com>
Tue, 5 Mar 2013 18:26:17 +0000 (20:26 +0200)
committerEzio Melotti <ezio.melotti@gmail.com>
Tue, 5 Mar 2013 18:26:17 +0000 (20:26 +0200)
Doc/library/test.rst
Lib/test/support.py
Lib/test/test_capi.py
Lib/test/test_faulthandler.py
Misc/NEWS

index 940d3e744e8302868bf3ad6a447f297e41fff9a0..702ef8ac428974da7f5914329cb16b06c6ef756c 100644 (file)
@@ -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 <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)
 
    A decorator to conditionally mark tests with
index d89e172d3d420e254244292e7d811e544354d7c2..ba1206cbb45bc55c62ded3d68452ee441b5c651f 100644 (file)
@@ -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'.
 
index 65778be501b9513c233277ac15f2c8f5de7dbfca..c0c8a12ac0e01dbe4a7278412a10bb75405dd715 100644 (file)
@@ -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,
index b81b34d3ef0f49027dd76440cf6514c395997842..4e6d9bc2ad128a1016434259647bf3894aba088d 100644 (file)
@@ -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))
index 5bc17841cda2253c9d3c58b4e1dac23f71ed8565..366500169925ff50b06d6317d9e89d802da26cd0 100644 (file)
--- 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.