8000 Android: update tests for newly-available functions affected by SELinux by mhsmith · Pull Request #126015 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

Android: update tests for newly-available functions affected by SELinux #126015

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Lib/test/support/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,11 @@ def requires_debug_ranges(reason='requires co_positions / debug_ranges'):

is_android = sys.platform == "android"

def skip_android_selinux(name):
return unittest.skipIf(
sys.platform == "android", f"Android blocks {name} with SELinux"
)

if sys.platform not in {"win32", "vxworks", "ios", "tvos", "watchos"}:
unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
else:
Expand Down
5 changes: 5 additions & 0 deletions Lib/test/test_socket.py
Original file line number Diff line number Diff line change
Expand Up @@ -1111,6 +1111,7 @@ def test_sethostname(self):

@unittest.skipUnless(hasattr(socket, 'if_nameindex'),
'socket.if_nameindex() not available.')
@support.skip_android_selinux('if_nameindex')
def testInterfaceNameIndex(self):
interfaces = socket.if_nameindex()
for index, name in interfaces:
Expand All @@ -1127,6 +1128,7 @@ def testInterfaceNameIndex(self):

@unittest.skipUnless(hasattr(socket, 'if_indextoname'),
'socket.if_indextoname() not available.')
@support.skip_android_selinux('if_indextoname')
def testInvalidInterfaceIndexToName(self):
self.assertRaises(OSError, socket.if_indextoname, 0)
self.assertRaises(OverflowError, socket.if_indextoname, -1)
Expand All @@ -1146,6 +1148,7 @@ def testInvalidInterfaceIndexToName(self):

@unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
'socket.if_nametoindex() not available.')
@support.skip_android_selinux('if_nametoindex')
def testInvalidInterfaceNameToIndex(self):
self.assertRaises(TypeError, socket.if_nametoindex, 0)
self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Expand Down Expand Up @@ -1878,6 +1881,7 @@ def test_getfqdn_filter_localhost(self):
@unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
@unittest.skipIf(AIX, 'Symbolic scope id does not work')
@unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
@support.skip_android_selinux('if_nameindex')
def test_getaddrinfo_ipv6_scopeid_symbolic(self):
# Just pick up any network interface (Linux, Mac OS X)
(ifindex, test_interface) = socket.if_nameindex()[0]
Expand Down Expand Up @@ -1911,6 +1915,7 @@ def test_getaddrinfo_ipv6_scopeid_numeric(self):
@unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
@unittest.skipIf(AIX, 'Symbolic scope id does not work')
@unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
@support.skip_android_selinux('if_nameindex')
def test_getnameinfo_ipv6_scopeid_symbolic(self):
# Just pick up any network interface.
(ifindex, test_interface) = socket.if_nameindex()[0]
Expand Down
17 changes: 15 additions & 2 deletions Lib/test/test_termios.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import sys
import tempfile
import unittest
from test import support
from test.support.import_helper import import_module

termios = import_module('termios')
Expand All @@ -18,10 +19,16 @@ def setUp(self):
tmp = self.enterContext(tempfile.TemporaryFile(mode='wb', buffering=0))
self.bad_fd = tmp.fileno()

def assertRaisesTermiosError(self, errno, callable, *args):
def assertRaisesTermiosError(self, err, callable, *args):
# Some versions of Android return EACCES when calling termios functions
# on a regular file.
errs = [err]
if sys.platform == 'android' and err == errno.ENOTTY:
errs.append(errno.EACCES)

with self.assertRaises(termios.error) as cm:
callable(*args)
self.assertEqual(cm.exception.args[0], errno)
self.assertIn(cm.exception.args[0], errs)

def test_tcgetattr(self):
attrs = termios.tcgetattr(self.fd)
Expand Down Expand Up @@ -90,6 +97,7 @@ def test_tcsetattr_errors(self):
self.assertRaises(TypeError, termios.tcsetattr, object(), termios.TCSANOW, attrs)
self.assertRaises(TypeError, termios.tcsetattr, self.fd, termios.TCSANOW)

@support.skip_android_selinux('tcsendbreak')
def test_tcsendbreak(self):
try:
termios.tcsendbreak(self.fd, 1)
Expand All @@ -100,6 +108,7 @@ def test_tcsendbreak(self):
raise
termios.tcsendbreak(self.stream, 1)

@support.skip_android_selinux('tcsendbreak')
def test_tcsendbreak_errors(self):
self.assertRaises(OverflowError, termios.tcsendbreak, self.fd, 2**1000)
self.assertRaises(TypeError, termios.tcsendbreak, self.fd, 0.0)
Expand All @@ -110,10 +119,12 @@ def test_tcsendbreak_errors(self):
self.assertRaises(TypeError, termios.tcsendbreak, object(), 0)
self.assertRaises(TypeError, termios.tcsendbreak, self.fd)

@support.skip_android_selinux('tcdrain')
def test_tcdrain(self):
termios.tcdrain(self.fd)
termios.tcdrain(self.stream)

@support.skip_android_selinux('tcdrain')
def test_tcdrain_errors(self):
self.assertRaisesTermiosError(errno.ENOTTY, termios.tcdrain, self.bad_fd)
self.assertRaises(ValueError, termios.tcdrain, -1)
Expand All @@ -136,12 +147,14 @@ def test_tcflush_errors(self):
self.assertRaises(TypeError, termios.tcflush, object(), termios.TCIFLUSH)
self.assertRaises(TypeError, termios.tcflush, self.fd)

@support.skip_android_selinux('tcflow')
def test_tcflow(self):
termios.tcflow(self.fd, termios.TCOOFF)
termios.tcflow(self.fd, termios.TCOON)
termios.tcflow(self.fd, termios.TCIOFF)
termios.tcflow(self.fd, termios.TCION)

@support.skip_android_selinux('tcflow')
def test_tcflow_errors(self):
self.assertRaisesTermiosError(errno.EINVAL, termios.tcflow, self.fd, -1)
self.assertRaises(OverflowError, termios.tcflow, self.fd, 2**1000)
Expand Down
Loading
0