Skip to content
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