1e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz"Test posix functions" 2e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 321d3a32b99c5763444c34c189ef653ac9745f3c4Walter Dörwaldfrom test import test_support 4e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 595fb46c9774cd3e4720174592b6d4eded7ac8fb0R. David Murray# Skip these tests if there is no posix module. 695fb46c9774cd3e4720174592b6d4eded7ac8fb0R. David Murrayposix = test_support.import_module('posix') 7e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 830b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrouimport errno 99e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussorenimport sys 10e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzimport time 11e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzimport os 12f838764444baac6cd58eba2bcd0a534e84b338e5Charles-François Nataliimport platform 13f48da8fbcdcf8c9eac2553131a07b8b375c0d726Gregory P. Smithimport pwd 145596b0cfc275a649f17a97c881d094a949adad6dFacundo Batistaimport shutil 1543e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deilyimport stat 16182ae64235c510c7b40f7b26a1490d3f2163d00dStefan Krahimport sys 17d88131afd9a683b16c4c80e1ff8e58f123cbd888Ned Deilyimport tempfile 18e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzimport unittest 19e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzimport warnings 2059beec326a4721154a952027cb34c3e2e4612e28R. David Murray 21d88131afd9a683b16c4c80e1ff8e58f123cbd888Ned Deily_DUMMY_SYMLINK = os.path.join(tempfile.gettempdir(), 22d88131afd9a683b16c4c80e1ff8e58f123cbd888Ned Deily test_support.TESTFN + '-dummy-symlink') 2359beec326a4721154a952027cb34c3e2e4612e28R. David Murray 24e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzwarnings.filterwarnings('ignore', '.* potential security risk .*', 25e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz RuntimeWarning) 26e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 27e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzclass PosixTester(unittest.TestCase): 28e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 29e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def setUp(self): 30e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz # create empty file 3121d3a32b99c5763444c34c189ef653ac9745f3c4Walter Dörwald fp = open(test_support.TESTFN, 'w+') 32e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz fp.close() 3343e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.teardown_files = [ test_support.TESTFN ] 34e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 35e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def tearDown(self): 3643e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily for teardown_file in self.teardown_files: 3743e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily os.unlink(teardown_file) 38e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 39e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def testNoArgFunctions(self): 40e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz # test posix functions which take no arguments and have 41e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz # no side-effects which we need to cleanup (e.g., fork, wait, abort) 42e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdu", "uname", 4371b13e8b4c4aad547d870a63e9b2f8784835eb2fNeal Norwitz "times", "getloadavg", "tmpnam", 44e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz "getegid", "geteuid", "getgid", "getgroups", 45e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz "getpid", "getpgrp", "getppid", "getuid", 46e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz ] 4771b13e8b4c4aad547d870a63e9b2f8784835eb2fNeal Norwitz 48b06146159600b5d9daaf1caf49db43b627ff759fAntoine Pitrou with warnings.catch_warnings(): 49b06146159600b5d9daaf1caf49db43b627ff759fAntoine Pitrou warnings.filterwarnings("ignore", "", DeprecationWarning) 50b06146159600b5d9daaf1caf49db43b627ff759fAntoine Pitrou for name in NO_ARG_FUNCTIONS: 51b06146159600b5d9daaf1caf49db43b627ff759fAntoine Pitrou posix_func = getattr(posix, name, None) 52b06146159600b5d9daaf1caf49db43b627ff759fAntoine Pitrou if posix_func is not None: 53b06146159600b5d9daaf1caf49db43b627ff759fAntoine Pitrou posix_func() 54b06146159600b5d9daaf1caf49db43b627ff759fAntoine Pitrou self.assertRaises(TypeError, posix_func, 1) 55e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 5632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'getresuid'), 5732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.getresuid()') 5832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka def test_getresuid(self): 5932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka user_ids = posix.getresuid() 6032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertEqual(len(user_ids), 3) 6132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka for val in user_ids: 6232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertGreaterEqual(val, 0) 6332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 6432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'getresgid'), 6532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.getresgid()') 6632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka def test_getresgid(self): 6732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka group_ids = posix.getresgid() 6832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertEqual(len(group_ids), 3) 6932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka for val in group_ids: 7032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertGreaterEqual(val, 0) 7132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 7232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'setresuid'), 7332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.setresuid()') 7432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka def test_setresuid(self): 7532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka current_user_ids = posix.getresuid() 7632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertIsNone(posix.setresuid(*current_user_ids)) 7732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # -1 means don't change that value. 7832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertIsNone(posix.setresuid(-1, -1, -1)) 7932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 8032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'setresuid'), 8132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.setresuid()') 8232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka def test_setresuid_exception(self): 8332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # Don't do this test if someone is silly enough to run us as root. 8432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka current_user_ids = posix.getresuid() 8532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka if 0 not in current_user_ids: 8632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka new_user_ids = (current_user_ids[0]+1, -1, -1) 8732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(OSError, posix.setresuid, *new_user_ids) 8832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 8932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'setresgid'), 9032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.setresgid()') 9132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka def test_setresgid(self): 9232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka current_group_ids = posix.getresgid() 9332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertIsNone(posix.setresgid(*current_group_ids)) 9432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # -1 means don't change that value. 9532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertIsNone(posix.setresgid(-1, -1, -1)) 9632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 9732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'setresgid'), 9832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.setresgid()') 9932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka def test_setresgid_exception(self): 10032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # Don't do this test if someone is silly enough to run us as root. 10132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka current_group_ids = posix.getresgid() 10232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka if 0 not in current_group_ids: 10332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka new_group_ids = (current_group_ids[0]+1, -1, -1) 10432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(OSError, posix.setresgid, *new_group_ids) 10550ea4565bd7805d7368b9278536f58c870313e92Martin v. Löwis 10630b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou @unittest.skipUnless(hasattr(posix, 'initgroups'), 10730b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou "test needs os.initgroups()") 10830b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou def test_initgroups(self): 10930b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou # It takes a string and an integer; check that it raises a TypeError 11030b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou # for other argument lists. 11130b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou self.assertRaises(TypeError, posix.initgroups) 11230b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou self.assertRaises(TypeError, posix.initgroups, None) 11330b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou self.assertRaises(TypeError, posix.initgroups, 3, "foo") 11430b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou self.assertRaises(TypeError, posix.initgroups, "foo", 3, object()) 11530b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou 11630b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou # If a non-privileged user invokes it, it should fail with OSError 11730b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou # EPERM. 11830b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou if os.getuid() != 0: 119666a573fa610afb5cf766d430f4f3bc5e602eed3Charles-François Natali try: 120666a573fa610afb5cf766d430f4f3bc5e602eed3Charles-François Natali name = pwd.getpwuid(posix.getuid()).pw_name 121666a573fa610afb5cf766d430f4f3bc5e602eed3Charles-François Natali except KeyError: 122666a573fa610afb5cf766d430f4f3bc5e602eed3Charles-François Natali # the current UID may not have a pwd entry 123666a573fa610afb5cf766d430f4f3bc5e602eed3Charles-François Natali raise unittest.SkipTest("need a pwd entry") 12430b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou try: 12530b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou posix.initgroups(name, 13) 12630b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou except OSError as e: 1272623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(e.errno, errno.EPERM) 12830b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou else: 12930b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou self.fail("Expected OSError to be raised by initgroups") 13030b3b35cbac52719e44d8457fd9a7be09e6edd2cAntoine Pitrou 13132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'statvfs'), 13232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.statvfs()') 133e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_statvfs(self): 13432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.statvfs(os.curdir)) 135e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 13632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'fstatvfs'), 13732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.fstatvfs()') 138e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_fstatvfs(self): 13932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp = open(test_support.TESTFN) 14032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 14132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.fstatvfs(fp.fileno())) 14232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka finally: 14332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp.close() 144e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 14532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'ftruncate'), 14632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.ftruncate()') 147e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_ftruncate(self): 14832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp = open(test_support.TESTFN, 'w+') 14932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 15032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # we need to have some data to truncate 15132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp.write('test') 15232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp.flush() 15332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka posix.ftruncate(fp.fileno(), 0) 15432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka finally: 15532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp.close() 156e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 15732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'dup'), 15832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.dup()') 159e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_dup(self): 16032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp = open(test_support.TESTFN) 16132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 16232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fd = posix.dup(fp.fileno()) 16332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertIsInstance(fd, int) 16432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.close(fd) 16532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka finally: 16632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp.close() 167e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 16832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'confstr'), 16932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.confstr()') 17094785ef14294e9d924c9ceee3d6f9082d4555f28Skip Montanaro def test_confstr(self): 17132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(ValueError, posix.confstr, "CS_garbage") 17232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True) 17394785ef14294e9d924c9ceee3d6f9082d4555f28Skip Montanaro 17432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'dup2'), 17532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.dup2()') 176e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_dup2(self): 17732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp1 = open(test_support.TESTFN) 17832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp2 = open(test_support.TESTFN) 17932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 18032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka posix.dup2(fp1.fileno(), fp2.fileno()) 18132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka finally: 18232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp1.close() 18332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp2.close() 184e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 185e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def fdopen_helper(self, *args): 18621d3a32b99c5763444c34c189ef653ac9745f3c4Walter Dörwald fd = os.open(test_support.TESTFN, os.O_RDONLY) 187e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz fp2 = posix.fdopen(fd, *args) 188e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz fp2.close() 189e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 19032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'fdopen'), 19132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.fdopen()') 192e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_fdopen(self): 19332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.fdopen_helper() 19432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.fdopen_helper('r') 19532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.fdopen_helper('r', 100) 196e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 197e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson @unittest.skipUnless(hasattr(posix, 'fdopen'), 198e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson 'test needs posix.fdopen()') 199e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson def test_fdopen_directory(self): 200e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson try: 201e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson fd = os.open('.', os.O_RDONLY) 202e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson except OSError as e: 203e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson self.assertEqual(e.errno, errno.EACCES) 204e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson self.skipTest("system cannot open directories") 205e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson with self.assertRaises(IOError) as cm: 206e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson os.fdopen(fd, 'r') 207e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson self.assertEqual(cm.exception.errno, errno.EISDIR) 208e37375405657413ef9b83b935bb4ed17cd745ce6Benjamin Peterson 20915773c893ff4e13f539a8b4071a417db90bb14f7Benjamin Peterson @unittest.skipUnless(hasattr(posix, 'fdopen') and 2105918f8f6120f66192bca6245cd31ee13b7ed9a9eBenjamin Peterson not sys.platform.startswith("sunos"), 21115773c893ff4e13f539a8b4071a417db90bb14f7Benjamin Peterson 'test needs posix.fdopen()') 21215773c893ff4e13f539a8b4071a417db90bb14f7Benjamin Peterson def test_fdopen_keeps_fd_open_on_errors(self): 21302ab7a84ef86cfe043bbfbbd2912dcc8c8c67793Benjamin Peterson fd = os.open(test_support.TESTFN, os.O_RDONLY) 21415773c893ff4e13f539a8b4071a417db90bb14f7Benjamin Peterson self.assertRaises(OSError, posix.fdopen, fd, 'w') 2155c863bf93809cefeb4469512eadac291b7046051Benjamin Peterson os.close(fd) # fd should not be closed. 21602ab7a84ef86cfe043bbfbbd2912dcc8c8c67793Benjamin Peterson 21732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'O_EXLOCK'), 21832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.O_EXLOCK') 21998470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro def test_osexlock(self): 22032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fd = os.open(test_support.TESTFN, 22132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.O_WRONLY|os.O_EXLOCK|os.O_CREAT) 22232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(OSError, os.open, test_support.TESTFN, 22332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK) 22432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.close(fd) 22532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 22632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka if hasattr(posix, "O_SHLOCK"): 22798470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro fd = os.open(test_support.TESTFN, 22832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.O_WRONLY|os.O_SHLOCK|os.O_CREAT) 22998470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro self.assertRaises(OSError, os.open, test_support.TESTFN, 23098470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK) 23198470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro os.close(fd) 23298470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro 23332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'O_SHLOCK'), 23432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.O_SHLOCK') 23598470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro def test_osshlock(self): 23632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fd1 = os.open(test_support.TESTFN, 23732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.O_WRONLY|os.O_SHLOCK|os.O_CREAT) 23832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fd2 = os.open(test_support.TESTFN, 23932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.O_WRONLY|os.O_SHLOCK|os.O_CREAT) 24032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.close(fd2) 24132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.close(fd1) 24232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 24332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka if hasattr(posix, "O_EXLOCK"): 24432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fd = os.open(test_support.TESTFN, 24598470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro os.O_WRONLY|os.O_SHLOCK|os.O_CREAT) 24632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(OSError, os.open, test_support.TESTFN, 24732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK) 24832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.close(fd) 24998470002672dd10c4b28763f26ed2f2320fac647Skip Montanaro 25032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'fstat'), 25132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.fstat()') 252e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_fstat(self): 25332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp = open(test_support.TESTFN) 25432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 25532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.fstat(fp.fileno())) 25632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka finally: 25732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp.close() 258e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 25932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'stat'), 26032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.stat()') 261e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_stat(self): 26232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.stat(test_support.TESTFN)) 263e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 2649aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka @unittest.skipUnless(hasattr(posix, 'stat'), 'test needs posix.stat()') 2659aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka @unittest.skipUnless(hasattr(posix, 'makedev'), 'test needs posix.makedev()') 2669aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka def test_makedev(self): 2679aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka st = posix.stat(test_support.TESTFN) 2689aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka dev = st.st_dev 2699aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertIsInstance(dev, (int, long)) 2709aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertGreaterEqual(dev, 0) 2719aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka 2729aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka major = posix.major(dev) 2739aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertIsInstance(major, (int, long)) 2749aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertGreaterEqual(major, 0) 2759aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertEqual(posix.major(int(dev)), major) 2769aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertEqual(posix.major(long(dev)), major) 2779aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.major, float(dev)) 2789aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.major) 2799aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises((ValueError, OverflowError), posix.major, -1) 2809aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka 2819aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka minor = posix.minor(dev) 2829aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertIsInstance(minor, (int, long)) 2839aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertGreaterEqual(minor, 0) 2849aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertEqual(posix.minor(int(dev)), minor) 2859aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertEqual(posix.minor(long(dev)), minor) 2869aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.minor, float(dev)) 2879aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.minor) 2889aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises((ValueError, OverflowError), posix.minor, -1) 2899aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka 2909aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertEqual(posix.makedev(major, minor), dev) 2919aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertEqual(posix.makedev(int(major), int(minor)), dev) 2929aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertEqual(posix.makedev(long(major), long(minor)), dev) 2939aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.makedev, float(major), minor) 2949aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.makedev, major, float(minor)) 2959aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.makedev, major) 2969aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka self.assertRaises(TypeError, posix.makedev) 2979aa16d93c9570771bdb8f0819e4b17f4284c952eSerhiy Storchaka 298da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka def _test_all_chown_common(self, chown_func, first_param, stat_func): 2999f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith """Common code for chown, fchown and lchown tests.""" 3003e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka def check_stat(uid, gid): 301da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka if stat_func is not None: 302da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka stat = stat_func(first_param) 3033e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka self.assertEqual(stat.st_uid, uid) 3043e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka self.assertEqual(stat.st_gid, gid) 3053e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka uid = os.getuid() 3063e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka gid = os.getgid() 307f838764444baac6cd58eba2bcd0a534e84b338e5Charles-François Natali # test a successful chown call 3083e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka chown_func(first_param, uid, gid) 3093e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 3103e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka chown_func(first_param, -1, gid) 3113e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 3123e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka chown_func(first_param, uid, -1) 3133e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 3143e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka 3153e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka if uid == 0: 3163e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # Try an amusingly large uid/gid to make sure we handle 3173e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # large unsigned values. (chown lets you use any 3183e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # uid/gid you like, even if they aren't defined.) 3193e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # 3203e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # This problem keeps coming up: 3213e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # http://bugs.python.org/issue1747858 3223e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # http://bugs.python.org/issue4591 3233e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # http://bugs.python.org/issue15301 3243e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # Hopefully the fix in 4591 fixes it for good! 3253e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # 3263e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # This part of the test only runs when run as root. 3273e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # Only scary people run their tests as root. 3283e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka 3293e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka big_value = 2**31 3303e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka chown_func(first_param, big_value, big_value) 3313e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(big_value, big_value) 3323e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka chown_func(first_param, -1, -1) 3333e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(big_value, big_value) 3343e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka chown_func(first_param, uid, gid) 3353e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 336f838764444baac6cd58eba2bcd0a534e84b338e5Charles-François Natali elif platform.system() in ('HP-UX', 'SunOS'): 337f838764444baac6cd58eba2bcd0a534e84b338e5Charles-François Natali # HP-UX and Solaris can allow a non-root user to chown() to root 338f838764444baac6cd58eba2bcd0a534e84b338e5Charles-François Natali # (issue #5113) 339f838764444baac6cd58eba2bcd0a534e84b338e5Charles-François Natali raise unittest.SkipTest("Skipping because of non-standard chown() " 340f838764444baac6cd58eba2bcd0a534e84b338e5Charles-François Natali "behavior") 3419f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith else: 3429f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith # non-root cannot chown to root, raises OSError 343da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka self.assertRaises(OSError, chown_func, first_param, 0, 0) 3443e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 345da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka self.assertRaises(OSError, chown_func, first_param, 0, -1) 3463e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 347484dee38e665e20f961b18f27a82b3224341c1beSerhiy Storchaka if 0 not in os.getgroups(): 348fffc479f15636d4f6afb297f4f8fb0016cd162a6Serhiy Storchaka self.assertRaises(OSError, chown_func, first_param, -1, 0) 349fffc479f15636d4f6afb297f4f8fb0016cd162a6Serhiy Storchaka check_stat(uid, gid) 3503e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka # test illegal types 3513e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka for t in str, float: 3523e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka self.assertRaises(TypeError, chown_func, first_param, t(uid), gid) 3533e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 3543e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka self.assertRaises(TypeError, chown_func, first_param, uid, t(gid)) 3553e188c4ebbde43e320eb9873c84733f174e6700cSerhiy Storchaka check_stat(uid, gid) 3569f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith 3579f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()") 3589f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith def test_chown(self): 3599f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith # raise an OSError if the file does not exist 3609f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith os.unlink(test_support.TESTFN) 3619f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith self.assertRaises(OSError, posix.chown, test_support.TESTFN, -1, -1) 3629f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith 3639f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith # re-create the file 3649f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith open(test_support.TESTFN, 'w').close() 365da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka self._test_all_chown_common(posix.chown, test_support.TESTFN, 366da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka getattr(posix, 'stat', None)) 367f48da8fbcdcf8c9eac2553131a07b8b375c0d726Gregory P. Smith 3689f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()") 3699f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith def test_fchown(self): 3709f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith os.unlink(test_support.TESTFN) 3719f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith 3729f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith # re-create the file 3739f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith test_file = open(test_support.TESTFN, 'w') 3749f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith try: 3759f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith fd = test_file.fileno() 376da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka self._test_all_chown_common(posix.fchown, fd, 377da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka getattr(posix, 'fstat', None)) 3789f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith finally: 3799f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith test_file.close() 3809f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith 3819f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()") 3829f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith def test_lchown(self): 3839f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith os.unlink(test_support.TESTFN) 3849f12d468f4f886d70831b34875e95d5efe9c6323Gregory P. Smith # create a symlink 38543e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily os.symlink(_DUMMY_SYMLINK, test_support.TESTFN) 386da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka self._test_all_chown_common(posix.lchown, test_support.TESTFN, 387da5c2a064699c657b69e11aaab0eca8d743dd7edSerhiy Storchaka getattr(posix, 'lstat', None)) 388f48da8fbcdcf8c9eac2553131a07b8b375c0d726Gregory P. Smith 38932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'chdir'), 'test needs posix.chdir()') 390e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_chdir(self): 39132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka posix.chdir(os.curdir) 39232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(OSError, posix.chdir, test_support.TESTFN) 393e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 39432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'lsdir'), 'test needs posix.lsdir()') 395e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_lsdir(self): 39632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertIn(test_support.TESTFN, posix.lsdir(os.curdir)) 397e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 39832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'access'), 'test needs posix.access()') 399e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_access(self): 40032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.access(test_support.TESTFN, os.R_OK)) 401e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 40232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'umask'), 'test needs posix.umask()') 403e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_umask(self): 40432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka old_mask = posix.umask(0) 40532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertIsInstance(old_mask, int) 40632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka posix.umask(old_mask) 407e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 40832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'strerror'), 40932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.strerror()') 410e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_strerror(self): 41132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.strerror(0)) 412e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 41332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'pipe'), 'test needs posix.pipe()') 414e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_pipe(self): 41532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka reader, writer = posix.pipe() 41632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.close(reader) 41732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.close(writer) 418e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 41932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'tempnam'), 42032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.tempnam()') 421e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_tempnam(self): 42232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka with warnings.catch_warnings(): 42332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka warnings.filterwarnings("ignore", "tempnam", DeprecationWarning) 42432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.tempnam()) 42532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.tempnam(os.curdir)) 42632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertTrue(posix.tempnam(os.curdir, 'blah')) 427e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 42832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'tmpfile'), 42932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.tmpfile()') 430e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_tmpfile(self): 43132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka with warnings.catch_warnings(): 43232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka warnings.filterwarnings("ignore", "tmpfile", DeprecationWarning) 43332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp = posix.tmpfile() 43432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka fp.close() 435e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 43632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'utime'), 'test needs posix.utime()') 437e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz def test_utime(self): 43832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka now = time.time() 43932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka posix.utime(test_support.TESTFN, None) 44032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (None, None)) 44132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (now, None)) 44232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertRaises(TypeError, posix.utime, test_support.TESTFN, (None, now)) 44332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka posix.utime(test_support.TESTFN, (int(now), int(now))) 44432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka posix.utime(test_support.TESTFN, (now, now)) 445e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 44643e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily def _test_chflags_regular_file(self, chflags_func, target_file): 44743e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily st = os.stat(target_file) 44843e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.assertTrue(hasattr(st, 'st_flags')) 4498c7c697e49336ef764462494a02250023716e82eVictor Stinner 4508c7c697e49336ef764462494a02250023716e82eVictor Stinner # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE. 4518c7c697e49336ef764462494a02250023716e82eVictor Stinner try: 4528c7c697e49336ef764462494a02250023716e82eVictor Stinner chflags_func(target_file, st.st_flags | stat.UF_IMMUTABLE) 4538c7c697e49336ef764462494a02250023716e82eVictor Stinner except OSError as err: 4548c7c697e49336ef764462494a02250023716e82eVictor Stinner if err.errno != errno.EOPNOTSUPP: 4558c7c697e49336ef764462494a02250023716e82eVictor Stinner raise 4568c7c697e49336ef764462494a02250023716e82eVictor Stinner msg = 'chflag UF_IMMUTABLE not supported by underlying fs' 4578c7c697e49336ef764462494a02250023716e82eVictor Stinner self.skipTest(msg) 4588c7c697e49336ef764462494a02250023716e82eVictor Stinner 45943e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily try: 46043e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily new_st = os.stat(target_file) 46143e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.assertEqual(st.st_flags | stat.UF_IMMUTABLE, new_st.st_flags) 46243e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily try: 46343e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily fd = open(target_file, 'w+') 46443e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily except IOError as e: 46543e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.assertEqual(e.errno, errno.EPERM) 46643e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily finally: 46743e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily posix.chflags(target_file, st.st_flags) 46843e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily 46943e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily @unittest.skipUnless(hasattr(posix, 'chflags'), 'test needs os.chflags()') 470382abeff0f1a53ffaaddfea06e8721bf42b66502Martin v. Löwis def test_chflags(self): 47143e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self._test_chflags_regular_file(posix.chflags, test_support.TESTFN) 47243e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily 47343e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()') 47443e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily def test_lchflags_regular_file(self): 47543e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self._test_chflags_regular_file(posix.lchflags, test_support.TESTFN) 47643e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily 47743e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily @unittest.skipUnless(hasattr(posix, 'lchflags'), 'test needs os.lchflags()') 47843e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily def test_lchflags_symlink(self): 47943e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily testfn_st = os.stat(test_support.TESTFN) 48043e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily 48143e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.assertTrue(hasattr(testfn_st, 'st_flags')) 48243e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily 48343e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily os.symlink(test_support.TESTFN, _DUMMY_SYMLINK) 48443e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.teardown_files.append(_DUMMY_SYMLINK) 48543e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily dummy_symlink_st = os.lstat(_DUMMY_SYMLINK) 48643e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily 4878c7c697e49336ef764462494a02250023716e82eVictor Stinner # ZFS returns EOPNOTSUPP when attempting to set flag UF_IMMUTABLE. 4888c7c697e49336ef764462494a02250023716e82eVictor Stinner try: 4898c7c697e49336ef764462494a02250023716e82eVictor Stinner posix.lchflags(_DUMMY_SYMLINK, 4908c7c697e49336ef764462494a02250023716e82eVictor Stinner dummy_symlink_st.st_flags | stat.UF_IMMUTABLE) 4918c7c697e49336ef764462494a02250023716e82eVictor Stinner except OSError as err: 4928c7c697e49336ef764462494a02250023716e82eVictor Stinner if err.errno != errno.EOPNOTSUPP: 4938c7c697e49336ef764462494a02250023716e82eVictor Stinner raise 4948c7c697e49336ef764462494a02250023716e82eVictor Stinner msg = 'chflag UF_IMMUTABLE not supported by underlying fs' 4958c7c697e49336ef764462494a02250023716e82eVictor Stinner self.skipTest(msg) 4968c7c697e49336ef764462494a02250023716e82eVictor Stinner 49743e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily try: 49843e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily new_testfn_st = os.stat(test_support.TESTFN) 49943e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily new_dummy_symlink_st = os.lstat(_DUMMY_SYMLINK) 50043e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily 50143e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.assertEqual(testfn_st.st_flags, new_testfn_st.st_flags) 50243e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily self.assertEqual(dummy_symlink_st.st_flags | stat.UF_IMMUTABLE, 50343e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily new_dummy_symlink_st.st_flags) 50443e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily finally: 50543e1054e38ebd3de91b51531cda8e2fd580c0207Ned Deily posix.lchflags(_DUMMY_SYMLINK, dummy_symlink_st.st_flags) 506382abeff0f1a53ffaaddfea06e8721bf42b66502Martin v. Löwis 50732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka @unittest.skipUnless(hasattr(posix, 'getcwd'), 50832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.getcwd()') 5095596b0cfc275a649f17a97c881d094a949adad6dFacundo Batista def test_getcwd_long_pathnames(self): 51032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef' 51132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka curdir = os.getcwd() 51232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka base_path = os.path.abspath(test_support.TESTFN) + '.getcwd' 5135596b0cfc275a649f17a97c881d094a949adad6dFacundo Batista 51432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 51532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.mkdir(base_path) 51632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.chdir(base_path) 51732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka except: 5181f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest("cannot create directory for testing") 5195596b0cfc275a649f17a97c881d094a949adad6dFacundo Batista 52032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 52132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka def _create_and_do_getcwd(dirname, current_path_length = 0): 52232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 52332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.mkdir(dirname) 52432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka except: 5251f70221b861a3714735251d57695b2f472d0599bZachary Ware self.skipTest("mkdir cannot create directory sufficiently " 5261f70221b861a3714735251d57695b2f472d0599bZachary Ware "deep for getcwd test") 52732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 52832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.chdir(dirname) 52932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka try: 53032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.getcwd() 53132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka if current_path_length < 4099: 53232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1) 53332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka except OSError as e: 53432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka expected_errno = errno.ENAMETOOLONG 53532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # The following platforms have quirky getcwd() 53632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # behaviour -- see issue 9185 and 15765 for 53732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka # more information. 53832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka quirky_platform = ( 53932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'sunos' in sys.platform or 54032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'netbsd' in sys.platform or 54132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'openbsd' in sys.platform 54232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka ) 54332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka if quirky_platform: 54432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka expected_errno = errno.ERANGE 54532e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka self.assertEqual(e.errno, expected_errno) 54632e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka finally: 54732e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.chdir('..') 54832e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.rmdir(dirname) 54932e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 55032e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka _create_and_do_getcwd(dirname) 55132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 55232e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka finally: 55332e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka os.chdir(curdir) 55432e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka shutil.rmtree(base_path) 5555596b0cfc275a649f17a97c881d094a949adad6dFacundo Batista 5568bc59fae569dc0fec9bac719e23e7d5431f756c0Antoine Pitrou @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()") 5579e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren def test_getgroups(self): 558fd3ba7b261d021d07b8e283705c72b9ece7f9d10Jesus Cea with os.popen('id -G 2>/dev/null') as idg: 5599e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren groups = idg.read().strip() 560666a573fa610afb5cf766d430f4f3bc5e602eed3Charles-François Natali ret = idg.close() 5619e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 562dee8dadf31a222ff0bd124e630ea88fd9070f9ccCharles-François Natali if ret != None or not groups: 5639e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren raise unittest.SkipTest("need working 'id -G'") 5649e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 565cc23cc672ff9164900b717bcc7f6484c03328bc0Ned Deily # Issues 16698: OS X ABIs prior to 10.6 have limits on getgroups() 566cc23cc672ff9164900b717bcc7f6484c03328bc0Ned Deily if sys.platform == 'darwin': 567cc23cc672ff9164900b717bcc7f6484c03328bc0Ned Deily import sysconfig 568cc23cc672ff9164900b717bcc7f6484c03328bc0Ned Deily dt = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') or '10.0' 5691f70b878c4b890c66bdb90d8c9ddb59dee0b48dfNed Deily if tuple(int(n) for n in dt.split('.')[0:2]) < (10, 6): 570cc23cc672ff9164900b717bcc7f6484c03328bc0Ned Deily raise unittest.SkipTest("getgroups(2) is broken prior to 10.6") 571cc23cc672ff9164900b717bcc7f6484c03328bc0Ned Deily 572ac72e58a279bb8a46047c87ddd7eeb0886a07692Ronald Oussoren # 'id -G' and 'os.getgroups()' should return the same 573ac72e58a279bb8a46047c87ddd7eeb0886a07692Ronald Oussoren # groups, ignoring order and duplicates. 5748bc59fae569dc0fec9bac719e23e7d5431f756c0Antoine Pitrou # #10822 - it is implementation defined whether posix.getgroups() 5758bc59fae569dc0fec9bac719e23e7d5431f756c0Antoine Pitrou # includes the effective gid so we include it anyway, since id -G does 5765719c2f97e986bfe2c63f758d662b86472fae29cRonald Oussoren self.assertEqual( 577ac72e58a279bb8a46047c87ddd7eeb0886a07692Ronald Oussoren set([int(x) for x in groups.split()]), 5788bc59fae569dc0fec9bac719e23e7d5431f756c0Antoine Pitrou set(posix.getgroups() + [posix.getegid()])) 5799e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 5803c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka @test_support.requires_unicode 5813c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka def test_path_with_null_unicode(self): 5823c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fn = test_support.TESTFN_UNICODE 58377c91066217621fd115cc28a108c5b37dcea9743Serhiy Storchaka try: 58477c91066217621fd115cc28a108c5b37dcea9743Serhiy Storchaka fn.encode(test_support.TESTFN_ENCODING) 58577c91066217621fd115cc28a108c5b37dcea9743Serhiy Storchaka except (UnicodeError, TypeError): 58677c91066217621fd115cc28a108c5b37dcea9743Serhiy Storchaka self.skipTest("Requires unicode filenames support") 5873c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fn_with_NUL = fn + u'\0' 5883c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.addCleanup(test_support.unlink, fn) 5893c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka test_support.unlink(fn) 5903c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fd = None 5913c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka try: 5923c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka with self.assertRaises(TypeError): 5933c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises 5943c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka finally: 5953c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka if fd is not None: 5963c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka os.close(fd) 5973c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertFalse(os.path.exists(fn)) 5983c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertRaises(TypeError, os.mkdir, fn_with_NUL) 5993c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertFalse(os.path.exists(fn)) 6003c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka open(fn, 'wb').close() 6013c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertRaises(TypeError, os.stat, fn_with_NUL) 6023c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka 6033c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka def test_path_with_null_byte(self): 6043c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fn = test_support.TESTFN 6053c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fn_with_NUL = fn + '\0' 6063c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.addCleanup(test_support.unlink, fn) 6073c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka test_support.unlink(fn) 6083c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fd = None 6093c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka try: 6103c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka with self.assertRaises(TypeError): 6113c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka fd = os.open(fn_with_NUL, os.O_WRONLY | os.O_CREAT) # raises 6123c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka finally: 6133c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka if fd is not None: 6143c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka os.close(fd) 6153c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertFalse(os.path.exists(fn)) 6163c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertRaises(TypeError, os.mkdir, fn_with_NUL) 6173c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertFalse(os.path.exists(fn)) 6183c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka open(fn, 'wb').close() 6193c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka self.assertRaises(TypeError, os.stat, fn_with_NUL) 6203c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka 6213c9ce74c218703ed75a11f71ed215559fa0c4257Serhiy Storchaka 6229e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussorenclass PosixGroupsTester(unittest.TestCase): 6239e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 6249e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren def setUp(self): 6259e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren if posix.getuid() != 0: 6269e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren raise unittest.SkipTest("not enough privileges") 6279e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren if not hasattr(posix, 'getgroups'): 6289e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren raise unittest.SkipTest("need posix.getgroups") 6299e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren if sys.platform == 'darwin': 6309e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren raise unittest.SkipTest("getgroups(2) is broken on OSX") 6319e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren self.saved_groups = posix.getgroups() 6329e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 6339e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren def tearDown(self): 6349e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren if hasattr(posix, 'setgroups'): 6359e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren posix.setgroups(self.saved_groups) 6369e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren elif hasattr(posix, 'initgroups'): 6379e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren name = pwd.getpwuid(posix.getuid()).pw_name 6389e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren posix.initgroups(name, self.saved_groups[0]) 6399e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 6409e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren @unittest.skipUnless(hasattr(posix, 'initgroups'), 64132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.initgroups()') 6429e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren def test_initgroups(self): 6439e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren # find missing group 6449e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 645bde1cfb0cdd97d12939fc48f294f814025574a39Benjamin Peterson g = max(self.saved_groups or [0]) + 1 6469e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren name = pwd.getpwuid(posix.getuid()).pw_name 6479e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren posix.initgroups(name, g) 6489e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren self.assertIn(g, posix.getgroups()) 6499e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 6509e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren @unittest.skipUnless(hasattr(posix, 'setgroups'), 65132e23e739f858fcf47332e437d6c4d4f14b2b697Serhiy Storchaka 'test needs posix.setgroups()') 6529e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren def test_setgroups(self): 6539e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren for groups in [[0], range(16)]: 6549e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren posix.setgroups(groups) 6559e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren self.assertListEqual(groups, posix.getgroups()) 6569e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren 6575596b0cfc275a649f17a97c881d094a949adad6dFacundo Batista 658e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzdef test_main(): 6599e7ffae537c72c361725ab7c6c8adede4eb9a8e0Ronald Oussoren test_support.run_unittest(PosixTester, PosixGroupsTester) 660e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz 661e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitzif __name__ == '__main__': 662e241ce830ab49be5af21b5cc08660866efc48f2eNeal Norwitz test_main() 663