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