mirror of https://github.com/python/cpython
bpo-32138: Skip on Android test_faulthandler tests that raise SIGSEGV (GH-4604)
Remove the test.support.requires_android_level decorator.
This commit is contained in:
parent
cc55e78aca
commit
ef83806f5e
|
@ -87,7 +87,7 @@ __all__ = [
|
||||||
"bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute",
|
"bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute",
|
||||||
"requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
|
"requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
|
||||||
"anticipate_failure", "load_package_tests", "detect_api_mismatch",
|
"anticipate_failure", "load_package_tests", "detect_api_mismatch",
|
||||||
"check__all__", "requires_android_level", "requires_multiprocessing_queue",
|
"check__all__", "requires_multiprocessing_queue",
|
||||||
"skip_unless_bind_unix_socket",
|
"skip_unless_bind_unix_socket",
|
||||||
# sys
|
# sys
|
||||||
"is_jython", "is_android", "check_impl_detail", "unix_shell",
|
"is_jython", "is_android", "check_impl_detail", "unix_shell",
|
||||||
|
@ -773,13 +773,7 @@ requires_lzma = unittest.skipUnless(lzma, 'requires lzma')
|
||||||
|
|
||||||
is_jython = sys.platform.startswith('java')
|
is_jython = sys.platform.startswith('java')
|
||||||
|
|
||||||
try:
|
is_android = hasattr(sys, 'getandroidapilevel')
|
||||||
# constant used by requires_android_level()
|
|
||||||
_ANDROID_API_LEVEL = sys.getandroidapilevel()
|
|
||||||
is_android = True
|
|
||||||
except AttributeError:
|
|
||||||
# sys.getandroidapilevel() is only available on Android
|
|
||||||
is_android = False
|
|
||||||
|
|
||||||
if sys.platform != 'win32':
|
if sys.platform != 'win32':
|
||||||
unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
|
unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
|
||||||
|
@ -1778,13 +1772,6 @@ def requires_resource(resource):
|
||||||
else:
|
else:
|
||||||
return unittest.skip("resource {0!r} is not enabled".format(resource))
|
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):
|
def cpython_only(test):
|
||||||
"""
|
"""
|
||||||
Decorator for tests only applicable on CPython.
|
Decorator for tests only applicable on CPython.
|
||||||
|
|
|
@ -6,7 +6,7 @@ import signal
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
from test import support
|
from test import support
|
||||||
from test.support import script_helper, is_android, requires_android_level
|
from test.support import script_helper, is_android
|
||||||
import tempfile
|
import tempfile
|
||||||
import threading
|
import threading
|
||||||
import unittest
|
import unittest
|
||||||
|
@ -29,6 +29,11 @@ def expected_traceback(lineno1, lineno2, header, min_count=1):
|
||||||
else:
|
else:
|
||||||
return '^' + regex + '$'
|
return '^' + regex + '$'
|
||||||
|
|
||||||
|
def skip_segfault_on_android(test):
|
||||||
|
# Issue #32138: Raising SIGSEGV on Android may not cause a crash.
|
||||||
|
return unittest.skipIf(is_android,
|
||||||
|
'raising SIGSEGV on Android is unreliable')(test)
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def temporary_filename():
|
def temporary_filename():
|
||||||
filename = tempfile.mktemp()
|
filename = tempfile.mktemp()
|
||||||
|
@ -37,10 +42,6 @@ def temporary_filename():
|
||||||
finally:
|
finally:
|
||||||
support.unlink(filename)
|
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):
|
class FaultHandlerTests(unittest.TestCase):
|
||||||
def get_output(self, code, filename=None, fd=None):
|
def get_output(self, code, filename=None, fd=None):
|
||||||
"""
|
"""
|
||||||
|
@ -140,7 +141,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
3,
|
3,
|
||||||
'access violation')
|
'access violation')
|
||||||
|
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_sigsegv(self):
|
def test_sigsegv(self):
|
||||||
self.check_fatal_error("""
|
self.check_fatal_error("""
|
||||||
import faulthandler
|
import faulthandler
|
||||||
|
@ -182,7 +183,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
|
|
||||||
@unittest.skipIf(_testcapi is None, 'need _testcapi')
|
@unittest.skipIf(_testcapi is None, 'need _testcapi')
|
||||||
@unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS')
|
@unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS')
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_sigbus(self):
|
def test_sigbus(self):
|
||||||
self.check_fatal_error("""
|
self.check_fatal_error("""
|
||||||
import _testcapi
|
import _testcapi
|
||||||
|
@ -197,7 +198,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
|
|
||||||
@unittest.skipIf(_testcapi is None, 'need _testcapi')
|
@unittest.skipIf(_testcapi is None, 'need _testcapi')
|
||||||
@unittest.skipUnless(hasattr(signal, 'SIGILL'), 'need signal.SIGILL')
|
@unittest.skipUnless(hasattr(signal, 'SIGILL'), 'need signal.SIGILL')
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_sigill(self):
|
def test_sigill(self):
|
||||||
self.check_fatal_error("""
|
self.check_fatal_error("""
|
||||||
import _testcapi
|
import _testcapi
|
||||||
|
@ -241,7 +242,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
'(?:Segmentation fault|Bus error)',
|
'(?:Segmentation fault|Bus error)',
|
||||||
other_regex='unable to raise a stack overflow')
|
other_regex='unable to raise a stack overflow')
|
||||||
|
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_gil_released(self):
|
def test_gil_released(self):
|
||||||
self.check_fatal_error("""
|
self.check_fatal_error("""
|
||||||
import faulthandler
|
import faulthandler
|
||||||
|
@ -251,7 +252,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
3,
|
3,
|
||||||
'Segmentation fault')
|
'Segmentation fault')
|
||||||
|
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_enable_file(self):
|
def test_enable_file(self):
|
||||||
with temporary_filename() as filename:
|
with temporary_filename() as filename:
|
||||||
self.check_fatal_error("""
|
self.check_fatal_error("""
|
||||||
|
@ -266,7 +267,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
|
|
||||||
@unittest.skipIf(sys.platform == "win32",
|
@unittest.skipIf(sys.platform == "win32",
|
||||||
"subprocess doesn't support pass_fds on Windows")
|
"subprocess doesn't support pass_fds on Windows")
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_enable_fd(self):
|
def test_enable_fd(self):
|
||||||
with tempfile.TemporaryFile('wb+') as fp:
|
with tempfile.TemporaryFile('wb+') as fp:
|
||||||
fd = fp.fileno()
|
fd = fp.fileno()
|
||||||
|
@ -280,7 +281,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
'Segmentation fault',
|
'Segmentation fault',
|
||||||
fd=fd)
|
fd=fd)
|
||||||
|
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_enable_single_thread(self):
|
def test_enable_single_thread(self):
|
||||||
self.check_fatal_error("""
|
self.check_fatal_error("""
|
||||||
import faulthandler
|
import faulthandler
|
||||||
|
@ -291,7 +292,7 @@ class FaultHandlerTests(unittest.TestCase):
|
||||||
'Segmentation fault',
|
'Segmentation fault',
|
||||||
all_threads=False)
|
all_threads=False)
|
||||||
|
|
||||||
@requires_raise
|
@skip_segfault_on_android
|
||||||
def test_disable(self):
|
def test_disable(self):
|
||||||
code = """
|
code = """
|
||||||
import faulthandler
|
import faulthandler
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Skip on Android test_faulthandler tests that raise SIGSEGV and remove the
|
||||||
|
test.support.requires_android_level decorator.
|
Loading…
Reference in New Issue