]> granicus.if.org Git - python/commitdiff
Fix test_faulthandler on Android where raise() exits with 0
authorXavier de Gaye <xdegaye@users.sourceforge.net>
Sun, 13 Nov 2016 19:46:46 +0000 (20:46 +0100)
committerXavier de Gaye <xdegaye@users.sourceforge.net>
Sun, 13 Nov 2016 19:46:46 +0000 (20:46 +0100)
Lib/test/support/__init__.py
Lib/test/test_faulthandler.py

index 8b66f95ee4e7ec48cf40b61b4418b7e910008be4..961b735591145af3a8d105a9f1774f0002314285 100644 (file)
@@ -90,7 +90,7 @@ __all__ = [
     "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute",
     "requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
     "anticipate_failure", "load_package_tests", "detect_api_mismatch",
-    "check__all__",
+    "check__all__", "requires_android_level",
     # sys
     "is_jython", "is_android", "check_impl_detail", "unix_shell",
     # network
@@ -735,7 +735,8 @@ requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
 
 is_jython = sys.platform.startswith('java')
 
-is_android = bool(sysconfig.get_config_var('ANDROID_API_LEVEL'))
+_ANDROID_API_LEVEL = sysconfig.get_config_var('ANDROID_API_LEVEL')
+is_android = (_ANDROID_API_LEVEL > 0)
 
 if sys.platform != 'win32':
     unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
@@ -1725,6 +1726,13 @@ def requires_resource(resource):
     else:
         return unittest.skip("resource {0!r} is not enabled".format(resource))
 
+def requires_android_level(level, reason):
+    if is_android and _ANDROID_API_LEVEL < level:
+        return unittest.skip('%s at Android API level %d' %
+                             (reason, _ANDROID_API_LEVEL))
+    else:
+        return _id
+
 def cpython_only(test):
     """
     Decorator for tests only applicable on CPython.
index 22ccbc9062d0f165e53a6e5ef1832145541eb45b..bdd8d1a2a6163fd8dfb64e6812327c9677dfad43 100644 (file)
@@ -7,7 +7,7 @@ import signal
 import subprocess
 import sys
 from test import support
-from test.support import script_helper
+from test.support import script_helper, is_android, requires_android_level
 import tempfile
 import unittest
 from textwrap import dedent
@@ -42,6 +42,10 @@ def temporary_filename():
     finally:
         support.unlink(filename)
 
+def requires_raise(test):
+    return (test if not is_android else
+                    requires_android_level(24, 'raise() is buggy')(test))
+
 class FaultHandlerTests(unittest.TestCase):
     def get_output(self, code, filename=None, fd=None):
         """
@@ -141,6 +145,7 @@ class FaultHandlerTests(unittest.TestCase):
                 3,
                 'access violation')
 
+    @requires_raise
     def test_sigsegv(self):
         self.check_fatal_error("""
             import faulthandler
@@ -183,6 +188,7 @@ class FaultHandlerTests(unittest.TestCase):
 
     @unittest.skipIf(_testcapi is None, 'need _testcapi')
     @unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS')
+    @requires_raise
     def test_sigbus(self):
         self.check_fatal_error("""
             import _testcapi
@@ -197,6 +203,7 @@ class FaultHandlerTests(unittest.TestCase):
 
     @unittest.skipIf(_testcapi is None, 'need _testcapi')
     @unittest.skipUnless(hasattr(signal, 'SIGILL'), 'need signal.SIGILL')
+    @requires_raise
     def test_sigill(self):
         self.check_fatal_error("""
             import _testcapi
@@ -240,6 +247,7 @@ class FaultHandlerTests(unittest.TestCase):
             '(?:Segmentation fault|Bus error)',
             other_regex='unable to raise a stack overflow')
 
+    @requires_raise
     def test_gil_released(self):
         self.check_fatal_error("""
             import faulthandler
@@ -249,6 +257,7 @@ class FaultHandlerTests(unittest.TestCase):
             3,
             'Segmentation fault')
 
+    @requires_raise
     def test_enable_file(self):
         with temporary_filename() as filename:
             self.check_fatal_error("""
@@ -263,6 +272,7 @@ class FaultHandlerTests(unittest.TestCase):
 
     @unittest.skipIf(sys.platform == "win32",
                      "subprocess doesn't support pass_fds on Windows")
+    @requires_raise
     def test_enable_fd(self):
         with tempfile.TemporaryFile('wb+') as fp:
             fd = fp.fileno()
@@ -276,6 +286,7 @@ class FaultHandlerTests(unittest.TestCase):
                 'Segmentation fault',
                 fd=fd)
 
+    @requires_raise
     def test_enable_single_thread(self):
         self.check_fatal_error("""
             import faulthandler
@@ -286,6 +297,7 @@ class FaultHandlerTests(unittest.TestCase):
             'Segmentation fault',
             all_threads=False)
 
+    @requires_raise
     def test_disable(self):
         code = """
             import faulthandler