summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorEzio Melotti <ezio.melotti@gmail.com>2013-03-07 16:44:29 (GMT)
committerEzio Melotti <ezio.melotti@gmail.com>2013-03-07 16:44:29 (GMT)
commit1f38621a336932754b242cd4779e7d0545fd0dfe (patch)
treed3c1332eec7dc52188db3ef644933916a3cd5752 /Lib/test
parentf9164e13fc10f3ea2e2e36b8eec96566867264f7 (diff)
downloadcpython-1f38621a336932754b242cd4779e7d0545fd0dfe.zip
cpython-1f38621a336932754b242cd4779e7d0545fd0dfe.tar.gz
cpython-1f38621a336932754b242cd4779e7d0545fd0dfe.tar.bz2
#11732: add a new suppress_crash_popup() context manager to test.support that disables crash popups on Windows and use it in test_ctypes.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/support.py26
-rw-r--r--Lib/test/test_capi.py11
2 files changed, 31 insertions, 6 deletions
diff --git a/Lib/test/support.py b/Lib/test/support.py
index 66ddf4b..ddda380 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -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'.
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 0ab1458..1c4c0f8 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -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.