]> granicus.if.org Git - python/commitdiff
Issue #28759: Fix the tests that fail with PermissionError when run as
authorXavier de Gaye <xdegaye@users.sourceforge.net>
Tue, 13 Dec 2016 09:00:01 +0000 (10:00 +0100)
committerXavier de Gaye <xdegaye@users.sourceforge.net>
Tue, 13 Dec 2016 09:00:01 +0000 (10:00 +0100)
a non-root user on Android where access rights are controled by SELinux MAC.

Lib/test/eintrdata/eintr_tester.py
Lib/test/support/__init__.py
Lib/test/test_genericpath.py
Lib/test/test_pathlib.py
Lib/test/test_posix.py
Lib/test/test_shutil.py
Lib/test/test_stat.py

index 9fbe04de9c5ddbe31dd1b526a01d0676dbc223bb..d194e775eaeb8f363084d8310b4a392412415706 100644 (file)
@@ -20,6 +20,7 @@ import time
 import unittest
 
 from test import support
+android_not_root = support.android_not_root
 
 @contextlib.contextmanager
 def kill_on_error(proc):
@@ -311,6 +312,7 @@ class SocketEINTRTest(EINTRBaseTest):
     # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=203162
     @support.requires_freebsd_version(10, 3)
     @unittest.skipUnless(hasattr(os, 'mkfifo'), 'needs mkfifo()')
+    @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
     def _test_open(self, do_open_close_reader, do_open_close_writer):
         filename = support.TESTFN
 
index 1a38c4ab32263f69c58e94fd545bf081613a70b2..ed1af2b5a5d3d686f979d9e5b93d813b592dede7 100644 (file)
@@ -93,7 +93,7 @@ __all__ = [
     "check__all__", "requires_android_level", "requires_multiprocessing_queue",
     # sys
     "is_jython", "is_android", "check_impl_detail", "unix_shell",
-    "setswitchinterval",
+    "setswitchinterval", "android_not_root",
     # network
     "HOST", "IPV6_ENABLED", "find_unused_port", "bind_port", "open_urlresource",
     # processes
@@ -769,6 +769,7 @@ is_jython = sys.platform.startswith('java')
 
 _ANDROID_API_LEVEL = sysconfig.get_config_var('ANDROID_API_LEVEL')
 is_android = (_ANDROID_API_LEVEL is not None and _ANDROID_API_LEVEL > 0)
+android_not_root = (is_android and os.geteuid() != 0)
 
 if sys.platform != 'win32':
     unix_shell = '/system/bin/sh' if is_android else '/bin/sh'
index ae5dd6a5f7cd06bbec0e1fcd7f5dd99b75cafe31..f698e13f68a7bf336e64e2b8db6744027f932774 100644 (file)
@@ -8,6 +8,7 @@ import sys
 import unittest
 import warnings
 from test import support
+android_not_root = support.android_not_root
 
 
 def create_file(filename, data=b'foo'):
@@ -212,6 +213,7 @@ class GenericTest:
     def test_samefile_on_symlink(self):
         self._test_samefile_on_link_func(os.symlink)
 
+    @unittest.skipIf(android_not_root, "hard links not allowed, non root user")
     def test_samefile_on_link(self):
         self._test_samefile_on_link_func(os.link)
 
@@ -251,6 +253,7 @@ class GenericTest:
     def test_samestat_on_symlink(self):
         self._test_samestat_on_link_func(os.symlink)
 
+    @unittest.skipIf(android_not_root, "hard links not allowed, non root user")
     def test_samestat_on_link(self):
         self._test_samestat_on_link_func(os.link)
 
index d25b1336f64187b504f5f6dcb2d578494fe74921..65b2d5abda19d456ccc3968e3c7af8b19811d1b4 100644 (file)
@@ -10,6 +10,7 @@ import tempfile
 import unittest
 
 from test import support
+android_not_root = support.android_not_root
 TESTFN = support.TESTFN
 
 try:
@@ -1864,6 +1865,7 @@ class _BasePathTest(object):
         self.assertFalse((P / 'fileA' / 'bah').is_fifo())
 
     @unittest.skipUnless(hasattr(os, "mkfifo"), "os.mkfifo() required")
+    @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
     def test_is_fifo_true(self):
         P = self.cls(BASE, 'myfifo')
         os.mkfifo(str(P))
index 63c74cd80da7a336f03ec0afd2d708da116bd416..029d0815e9458984cc8a078db010b3411bd9a6e3 100644 (file)
@@ -1,6 +1,7 @@
 "Test posix functions"
 
 from test import support
+android_not_root = support.android_not_root
 
 # Skip these tests if there is no posix module.
 posix = support.import_module('posix')
@@ -422,6 +423,7 @@ class PosixTester(unittest.TestCase):
                 posix.stat, list(os.fsencode(support.TESTFN)))
 
     @unittest.skipUnless(hasattr(posix, 'mkfifo'), "don't have mkfifo()")
+    @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
     def test_mkfifo(self):
         support.unlink(support.TESTFN)
         posix.mkfifo(support.TESTFN, stat.S_IRUSR | stat.S_IWUSR)
@@ -429,6 +431,7 @@ class PosixTester(unittest.TestCase):
 
     @unittest.skipUnless(hasattr(posix, 'mknod') and hasattr(stat, 'S_IFIFO'),
                          "don't have mknod()/S_IFIFO")
+    @unittest.skipIf(android_not_root, "mknod not allowed, non root user")
     def test_mknod(self):
         # Test using mknod() to create a FIFO (the only use specified
         # by POSIX).
@@ -907,6 +910,7 @@ class PosixTester(unittest.TestCase):
             posix.close(f)
 
     @unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
+    @unittest.skipIf(android_not_root, "hard link not allowed, non root user")
     def test_link_dir_fd(self):
         f = posix.open(posix.getcwd(), posix.O_RDONLY)
         try:
@@ -930,6 +934,7 @@ class PosixTester(unittest.TestCase):
 
     @unittest.skipUnless((os.mknod in os.supports_dir_fd) and hasattr(stat, 'S_IFIFO'),
                          "test requires both stat.S_IFIFO and dir_fd support for os.mknod()")
+    @unittest.skipIf(android_not_root, "mknod not allowed, non root user")
     def test_mknod_dir_fd(self):
         # Test using mknodat() to create a FIFO (the only use specified
         # by POSIX).
@@ -1013,6 +1018,7 @@ class PosixTester(unittest.TestCase):
             posix.close(f)
 
     @unittest.skipUnless(os.mkfifo in os.supports_dir_fd, "test needs dir_fd support in os.mkfifo()")
+    @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
     def test_mkfifo_dir_fd(self):
         support.unlink(support.TESTFN)
         f = posix.open(posix.getcwd(), posix.O_RDONLY)
index af5f00fdf0d7402bb04c36d6abb6847bf055f957..46e2c57746d2887050133bebe0615c0d185d8f83 100644 (file)
@@ -22,7 +22,8 @@ import tarfile
 import warnings
 
 from test import support
-from test.support import TESTFN, check_warnings, captured_stdout, requires_zlib
+from test.support import (TESTFN, check_warnings, captured_stdout,
+                          requires_zlib, android_not_root)
 
 try:
     import bz2
@@ -787,6 +788,7 @@ class TestShutil(unittest.TestCase):
 
     @unittest.skipIf(os.name == 'nt', 'temporarily disabled on Windows')
     @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
+    @unittest.skipIf(android_not_root, "hard links not allowed, non root user")
     def test_dont_copy_file_onto_link_to_itself(self):
         # bug 851123.
         os.mkdir(TESTFN)
@@ -839,6 +841,7 @@ class TestShutil(unittest.TestCase):
 
     # Issue #3002: copyfile and copytree block indefinitely on named pipes
     @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()')
+    @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
     def test_copyfile_named_pipe(self):
         os.mkfifo(TESTFN)
         try:
@@ -849,6 +852,7 @@ class TestShutil(unittest.TestCase):
         finally:
             os.remove(TESTFN)
 
+    @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
     @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()')
     @support.skip_unless_symlink
     def test_copytree_named_pipe(self):
index f1a5938a39fefbee499a3bc02c730362a7426312..cd02a6ee37452b9687c01e24e1ec471ad96726a4 100644 (file)
@@ -1,7 +1,7 @@
 import unittest
 import os
 import sys
-from test.support import TESTFN, import_fresh_module
+from test.support import TESTFN, import_fresh_module, android_not_root
 
 c_stat = import_fresh_module('stat', fresh=['_stat'])
 py_stat = import_fresh_module('stat', blocked=['_stat'])
@@ -168,6 +168,7 @@ class TestFilemode:
             self.assertS_IS("LNK", st_mode)
 
     @unittest.skipUnless(hasattr(os, 'mkfifo'), 'os.mkfifo not available')
+    @unittest.skipIf(android_not_root, "mkfifo not allowed, non root user")
     def test_fifo(self):
         os.mkfifo(TESTFN, 0o700)
         st_mode, modestr = self.get_mode()