]> granicus.if.org Git - python/commitdiff
#11732: add a new suppress_crash_popup() context manager to test.support that disable...
authorEzio Melotti <ezio.melotti@gmail.com>
Thu, 7 Mar 2013 16:44:29 +0000 (18:44 +0200)
committerEzio Melotti <ezio.melotti@gmail.com>
Thu, 7 Mar 2013 16:44:29 +0000 (18:44 +0200)
Doc/library/test.rst
Lib/test/support.py
Lib/test/test_capi.py
Misc/NEWS

index 40f4115ead00d19dcb206999722546c9f2083ec2..24e06d5215296c2ed0efafd5fa2d56ebb0a18812 100644 (file)
@@ -365,6 +365,13 @@ The :mod:`test.support` module defines the following functions:
       assert s.getvalue() == "hello\n"
 
 
+.. 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.
+
+
 .. function:: import_module(name, deprecated=False)
 
    This function imports and returns the named module. Unlike a normal
index 66ddf4b0fde498682b1b04ee0d2ef9778d1b8722..ddda380f35443c9b8eaadf75fb0a738ca2694f4b 100644 (file)
@@ -56,7 +56,7 @@ __all__ = [
     "reap_children", "cpython_only", "check_impl_detail", "get_attribute",
     "swap_item", "swap_attr", "requires_IEEE_754",
     "TestHandler", "Matcher", "can_symlink", "skip_unless_symlink",
-    "import_fresh_module", "failfast", "run_with_tz"
+    "import_fresh_module", "failfast", "run_with_tz", "suppress_crash_popup",
     ]
 
 class Error(Exception):
@@ -1775,6 +1775,30 @@ def skip_unless_symlink(test):
     msg = "Requires functional symlink implementation"
     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
+        # GetErrorMode is not available on Windows XP and Windows Server 2003,
+        # but SetErrorMode returns the previous value, so we can use that
+        import ctypes
+        k32 = ctypes.windll.kernel32
+        SEM_NOGPFAULTERRORBOX = 0x02
+        old_error_mode = k32.SetErrorMode(SEM_NOGPFAULTERRORBOX)
+        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 0ab145807e14387cd8a7aa53bd7f53be9bc1ba60..1c4c0f8c46e2e3cd247c18d919d4944002579932 100644 (file)
@@ -46,11 +46,12 @@ 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",
-                              'import _testcapi;'
-                              '_testcapi.crash_no_current_thread()'],
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
+        with support.suppress_crash_popup():
+            p = subprocess.Popen([sys.executable, "-c",
+                                  'import _testcapi;'
+                                  '_testcapi.crash_no_current_thread()'],
+                                 stdout=subprocess.PIPE,
+                                 stderr=subprocess.PIPE)
         (out, err) = p.communicate()
         self.assertEqual(out, b'')
         # This used to cause an infinite loop.
index e9c78b3b31a8fe52b3c07f513e1fe8482f01cc23..8cbf191814f5cc3f2195a35e1d0c430cce29a9fa 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -950,6 +950,9 @@ Extension Modules
 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_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.