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:
xdegaye 2017-11-29 11:43:23 +01:00 committed by GitHub
parent cc55e78aca
commit ef83806f5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 28 deletions

View File

@ -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.

View File

@ -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

View File

@ -0,0 +1,2 @@
Skip on Android test_faulthandler tests that raise SIGSEGV and remove the
test.support.requires_android_level decorator.