blob: 87c63adc60a3bbbd00299d6b2f48ed935a57dbdf [file] [log] [blame]
Neal Norwitze241ce82003-02-17 18:17:05 +00001"Test posix functions"
2
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003from test import support
R. David Murrayeb3615d2009-04-22 02:24:39 +00004
5# Skip these tests if there is no posix module.
6posix = support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00007
Antoine Pitroub7572f02009-12-02 20:46:48 +00008import errno
Neal Norwitze241ce82003-02-17 18:17:05 +00009import time
10import os
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000011import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000012import shutil
Neal Norwitze241ce82003-02-17 18:17:05 +000013import unittest
14import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000015
Neal Norwitze241ce82003-02-17 18:17:05 +000016warnings.filterwarnings('ignore', '.* potential security risk .*',
17 RuntimeWarning)
18
19class PosixTester(unittest.TestCase):
20
21 def setUp(self):
22 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000023 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000024 fp.close()
25
26 def tearDown(self):
Neal Norwitzc34177c2008-08-25 01:04:16 +000027 support.unlink(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000028
29 def testNoArgFunctions(self):
30 # test posix functions which take no arguments and have
31 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000032 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000033 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000034 "getegid", "geteuid", "getgid", "getgroups",
35 "getpid", "getpgrp", "getppid", "getuid",
36 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000037
Neal Norwitze241ce82003-02-17 18:17:05 +000038 for name in NO_ARG_FUNCTIONS:
39 posix_func = getattr(posix, name, None)
40 if posix_func is not None:
41 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000042 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000043
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000044 if hasattr(posix, 'getresuid'):
45 def test_getresuid(self):
46 user_ids = posix.getresuid()
47 self.assertEqual(len(user_ids), 3)
48 for val in user_ids:
49 self.assertGreaterEqual(val, 0)
50
51 if hasattr(posix, 'getresgid'):
52 def test_getresgid(self):
53 group_ids = posix.getresgid()
54 self.assertEqual(len(group_ids), 3)
55 for val in group_ids:
56 self.assertGreaterEqual(val, 0)
57
58 if hasattr(posix, 'setresuid'):
59 def test_setresuid(self):
60 current_user_ids = posix.getresuid()
61 self.assertIsNone(posix.setresuid(*current_user_ids))
62 # -1 means don't change that value.
63 self.assertIsNone(posix.setresuid(-1, -1, -1))
64
65 def test_setresuid_exception(self):
66 # Don't do this test if someone is silly enough to run us as root.
67 current_user_ids = posix.getresuid()
68 if 0 not in current_user_ids:
69 new_user_ids = (current_user_ids[0]+1, -1, -1)
70 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
71
72 if hasattr(posix, 'setresgid'):
73 def test_setresgid(self):
74 current_group_ids = posix.getresgid()
75 self.assertIsNone(posix.setresgid(*current_group_ids))
76 # -1 means don't change that value.
77 self.assertIsNone(posix.setresgid(-1, -1, -1))
78
79 def test_setresgid_exception(self):
80 # Don't do this test if someone is silly enough to run us as root.
81 current_group_ids = posix.getresgid()
82 if 0 not in current_group_ids:
83 new_group_ids = (current_group_ids[0]+1, -1, -1)
84 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
85
Antoine Pitroub7572f02009-12-02 20:46:48 +000086 @unittest.skipUnless(hasattr(posix, 'initgroups'),
87 "test needs os.initgroups()")
88 def test_initgroups(self):
89 # It takes a string and an integer; check that it raises a TypeError
90 # for other argument lists.
91 self.assertRaises(TypeError, posix.initgroups)
92 self.assertRaises(TypeError, posix.initgroups, None)
93 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
94 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
95
96 # If a non-privileged user invokes it, it should fail with OSError
97 # EPERM.
98 if os.getuid() != 0:
99 name = pwd.getpwuid(posix.getuid()).pw_name
100 try:
101 posix.initgroups(name, 13)
102 except OSError as e:
103 self.assertEquals(e.errno, errno.EPERM)
104 else:
105 self.fail("Expected OSError to be raised by initgroups")
106
Neal Norwitze241ce82003-02-17 18:17:05 +0000107 def test_statvfs(self):
108 if hasattr(posix, 'statvfs'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000109 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000110
111 def test_fstatvfs(self):
112 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000113 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000114 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000115 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000116 finally:
117 fp.close()
118
119 def test_ftruncate(self):
120 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000121 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000122 try:
123 # we need to have some data to truncate
124 fp.write('test')
125 fp.flush()
126 posix.ftruncate(fp.fileno(), 0)
127 finally:
128 fp.close()
129
130 def test_dup(self):
131 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000132 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000133 try:
134 fd = posix.dup(fp.fileno())
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000135 self.assertTrue(isinstance(fd, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000136 os.close(fd)
137 finally:
138 fp.close()
139
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000140 def test_confstr(self):
141 if hasattr(posix, 'confstr'):
142 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
143 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
144
Neal Norwitze241ce82003-02-17 18:17:05 +0000145 def test_dup2(self):
146 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000147 fp1 = open(support.TESTFN)
148 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000149 try:
150 posix.dup2(fp1.fileno(), fp2.fileno())
151 finally:
152 fp1.close()
153 fp2.close()
154
Skip Montanaro98470002005-06-17 01:14:49 +0000155 def test_osexlock(self):
156 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000157 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000158 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000159 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000160 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
161 os.close(fd)
162
163 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000164 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000165 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000166 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000167 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
168 os.close(fd)
169
170 def test_osshlock(self):
171 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000172 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000173 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000174 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000175 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
176 os.close(fd2)
177 os.close(fd1)
178
179 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000180 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000181 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000182 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000183 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
184 os.close(fd)
185
Neal Norwitze241ce82003-02-17 18:17:05 +0000186 def test_fstat(self):
187 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000188 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000189 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000190 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000191 finally:
192 fp.close()
193
194 def test_stat(self):
195 if hasattr(posix, 'stat'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000196 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000197
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000198 def _test_all_chown_common(self, chown_func, first_param):
199 """Common code for chown, fchown and lchown tests."""
200 if os.getuid() == 0:
201 try:
202 # Many linux distros have a nfsnobody user as MAX_UID-2
203 # that makes a good test case for signedness issues.
204 # http://bugs.python.org/issue1747858
205 # This part of the test only runs when run as root.
206 # Only scary people run their tests as root.
207 ent = pwd.getpwnam('nfsnobody')
208 chown_func(first_param, ent.pw_uid, ent.pw_gid)
209 except KeyError:
210 pass
211 else:
212 # non-root cannot chown to root, raises OSError
213 self.assertRaises(OSError, chown_func,
214 first_param, 0, 0)
215 # test a successful chown call
216 chown_func(first_param, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000217
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000218 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
219 def test_chown(self):
220 # raise an OSError if the file does not exist
221 os.unlink(support.TESTFN)
222 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000223
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000224 # re-create the file
225 open(support.TESTFN, 'w').close()
226 self._test_all_chown_common(posix.chown, support.TESTFN)
227
228 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
229 def test_fchown(self):
230 os.unlink(support.TESTFN)
231
232 # re-create the file
233 test_file = open(support.TESTFN, 'w')
234 try:
235 fd = test_file.fileno()
236 self._test_all_chown_common(posix.fchown, fd)
237 finally:
238 test_file.close()
239
240 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
241 def test_lchown(self):
242 os.unlink(support.TESTFN)
243 # create a symlink
244 os.symlink('/tmp/dummy-symlink-target', support.TESTFN)
245 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000246
Neal Norwitze241ce82003-02-17 18:17:05 +0000247 def test_chdir(self):
248 if hasattr(posix, 'chdir'):
249 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000250 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000251
252 def test_lsdir(self):
253 if hasattr(posix, 'lsdir'):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000254 self.assertIn(support.TESTFN, posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000255
256 def test_access(self):
257 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000258 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000259
260 def test_umask(self):
261 if hasattr(posix, 'umask'):
262 old_mask = posix.umask(0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000263 self.assertTrue(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000264 posix.umask(old_mask)
265
266 def test_strerror(self):
267 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000268 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000269
270 def test_pipe(self):
271 if hasattr(posix, 'pipe'):
272 reader, writer = posix.pipe()
273 os.close(reader)
274 os.close(writer)
275
Neal Norwitze241ce82003-02-17 18:17:05 +0000276 def test_utime(self):
277 if hasattr(posix, 'utime'):
278 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000279 posix.utime(support.TESTFN, None)
280 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
281 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
282 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
283 posix.utime(support.TESTFN, (int(now), int(now)))
284 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000285
Thomas Wouterscf297e42007-02-23 15:07:44 +0000286 def test_chflags(self):
287 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000288 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000289 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000290 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000291
292 def test_lchflags(self):
293 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000294 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000295 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000296 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000297
Guido van Rossum98297ee2007-11-06 21:34:58 +0000298 def test_environ(self):
299 for k, v in posix.environ.items():
300 self.assertEqual(type(k), str)
301 self.assertEqual(type(v), str)
302
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000303 def test_getcwd_long_pathnames(self):
304 if hasattr(posix, 'getcwd'):
305 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
306 curdir = os.getcwd()
307 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
308
309 try:
310 os.mkdir(base_path)
311 os.chdir(base_path)
312 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000313# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000314# because the test results in Error in that case.
315# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000316# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000317 return
318
319 def _create_and_do_getcwd(dirname, current_path_length = 0):
320 try:
321 os.mkdir(dirname)
322 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000323 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000324
325 os.chdir(dirname)
326 try:
327 os.getcwd()
328 if current_path_length < 1027:
329 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
330 finally:
331 os.chdir('..')
332 os.rmdir(dirname)
333
334 _create_and_do_getcwd(dirname)
335
336 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000337 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000338 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000339
340
Neal Norwitze241ce82003-02-17 18:17:05 +0000341def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000342 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000343
344if __name__ == '__main__':
345 test_main()