From ef83806f5ec01f34f6cbf4ebb5752875b5961f7e Mon Sep 17 00:00:00 2001 From: xdegaye Date: Wed, 29 Nov 2017 11:43:23 +0100 Subject: [PATCH] bpo-32138: Skip on Android test_faulthandler tests that raise SIGSEGV (GH-4604) Remove the test.support.requires_android_level decorator. --- Lib/test/support/__init__.py | 17 ++---------- Lib/test/test_faulthandler.py | 27 ++++++++++--------- .../2017-11-27-16-18-58.bpo-32138.QsTvf-.rst | 2 ++ 3 files changed, 18 insertions(+), 28 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2017-11-27-16-18-58.bpo-32138.QsTvf-.rst diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index e8648964d1e29e..42c41ff479a7a3 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -87,7 +87,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__", "requires_android_level", "requires_multiprocessing_queue", + "check__all__", "requires_multiprocessing_queue", "skip_unless_bind_unix_socket", # sys "is_jython", "is_android", "check_impl_detail", "unix_shell", @@ -773,13 +773,7 @@ def dec(*args, **kwargs): is_jython = sys.platform.startswith('java') -try: - # 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 +is_android = hasattr(sys, 'getandroidapilevel') if sys.platform != 'win32': unix_shell = '/system/bin/sh' if is_android else '/bin/sh' @@ -1778,13 +1772,6 @@ 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. diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index e0e53c2f829210..3647bfc719ecc6 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -6,7 +6,7 @@ import subprocess import sys 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 threading import unittest @@ -29,6 +29,11 @@ def expected_traceback(lineno1, lineno2, header, min_count=1): else: 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 def temporary_filename(): filename = tempfile.mktemp() @@ -37,10 +42,6 @@ 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): """ @@ -140,7 +141,7 @@ def test_read_null(self): 3, 'access violation') - @requires_raise + @skip_segfault_on_android def test_sigsegv(self): self.check_fatal_error(""" import faulthandler @@ -182,7 +183,7 @@ def test_sigfpe(self): @unittest.skipIf(_testcapi is None, 'need _testcapi') @unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS') - @requires_raise + @skip_segfault_on_android def test_sigbus(self): self.check_fatal_error(""" import _testcapi @@ -197,7 +198,7 @@ def test_sigbus(self): @unittest.skipIf(_testcapi is None, 'need _testcapi') @unittest.skipUnless(hasattr(signal, 'SIGILL'), 'need signal.SIGILL') - @requires_raise + @skip_segfault_on_android def test_sigill(self): self.check_fatal_error(""" import _testcapi @@ -241,7 +242,7 @@ def test_stack_overflow(self): '(?:Segmentation fault|Bus error)', other_regex='unable to raise a stack overflow') - @requires_raise + @skip_segfault_on_android def test_gil_released(self): self.check_fatal_error(""" import faulthandler @@ -251,7 +252,7 @@ def test_gil_released(self): 3, 'Segmentation fault') - @requires_raise + @skip_segfault_on_android def test_enable_file(self): with temporary_filename() as filename: self.check_fatal_error(""" @@ -266,7 +267,7 @@ def test_enable_file(self): @unittest.skipIf(sys.platform == "win32", "subprocess doesn't support pass_fds on Windows") - @requires_raise + @skip_segfault_on_android def test_enable_fd(self): with tempfile.TemporaryFile('wb+') as fp: fd = fp.fileno() @@ -280,7 +281,7 @@ def test_enable_fd(self): 'Segmentation fault', fd=fd) - @requires_raise + @skip_segfault_on_android def test_enable_single_thread(self): self.check_fatal_error(""" import faulthandler @@ -291,7 +292,7 @@ def test_enable_single_thread(self): 'Segmentation fault', all_threads=False) - @requires_raise + @skip_segfault_on_android def test_disable(self): code = """ import faulthandler diff --git a/Misc/NEWS.d/next/Tests/2017-11-27-16-18-58.bpo-32138.QsTvf-.rst b/Misc/NEWS.d/next/Tests/2017-11-27-16-18-58.bpo-32138.QsTvf-.rst new file mode 100644 index 00000000000000..2430aa7f106b5f --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2017-11-27-16-18-58.bpo-32138.QsTvf-.rst @@ -0,0 +1,2 @@ +Skip on Android test_faulthandler tests that raise SIGSEGV and remove the +test.support.requires_android_level decorator.