diff -r 805467de22fc Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py Sun Nov 06 13:19:38 2016 +0200 +++ b/Lib/test/support/__init__.py Mon Nov 07 12:55:21 2016 +0100 @@ -90,7 +90,7 @@ "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", "requires_raise", # sys "is_jython", "is_android", "check_impl_detail", "unix_shell", # network @@ -735,7 +735,8 @@ 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,19 @@ 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 requires_raise(): + if is_android: + return requires_android_level(24, 'raise() is buggy') + else: + return _id + def cpython_only(test): """ Decorator for tests only applicable on CPython. diff -r 805467de22fc Lib/test/test_faulthandler.py --- a/Lib/test/test_faulthandler.py Sun Nov 06 13:19:38 2016 +0200 +++ b/Lib/test/test_faulthandler.py Mon Nov 07 12:55:21 2016 +0100 @@ -7,7 +7,7 @@ import subprocess import sys from test import support -from test.support import script_helper +from test.support import script_helper, requires_raise import tempfile import unittest from textwrap import dedent @@ -141,6 +141,7 @@ 3, 'access violation') + @requires_raise() def test_sigsegv(self): self.check_fatal_error(""" import faulthandler @@ -183,6 +184,7 @@ @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 +199,7 @@ @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 +243,7 @@ '(?: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 +253,7 @@ 3, 'Segmentation fault') + @requires_raise() def test_enable_file(self): with temporary_filename() as filename: self.check_fatal_error(""" @@ -263,6 +268,7 @@ @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 +282,7 @@ 'Segmentation fault', fd=fd) + @requires_raise() def test_enable_single_thread(self): self.check_fatal_error(""" import faulthandler @@ -286,6 +293,7 @@ 'Segmentation fault', all_threads=False) + @requires_raise() def test_disable(self): code = """ import faulthandler