blob: cbc786cdc0f585803d02a59a6931a23af5cc63ef [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 +000016
17class PosixTester(unittest.TestCase):
18
19 def setUp(self):
20 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000021 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000022 fp.close()
Brett Cannonc8d502e2010-03-20 21:53:28 +000023 self._warnings_manager = support.check_warnings()
24 self._warnings_manager.__enter__()
25 warnings.filterwarnings('ignore', '.* potential security risk .*',
26 RuntimeWarning)
Neal Norwitze241ce82003-02-17 18:17:05 +000027
28 def tearDown(self):
Neal Norwitzc34177c2008-08-25 01:04:16 +000029 support.unlink(support.TESTFN)
Brett Cannonc8d502e2010-03-20 21:53:28 +000030 self._warnings_manager.__exit__(None, None, None)
Neal Norwitze241ce82003-02-17 18:17:05 +000031
32 def testNoArgFunctions(self):
33 # test posix functions which take no arguments and have
34 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000035 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000036 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000037 "getegid", "geteuid", "getgid", "getgroups",
38 "getpid", "getpgrp", "getppid", "getuid",
39 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000040
Neal Norwitze241ce82003-02-17 18:17:05 +000041 for name in NO_ARG_FUNCTIONS:
42 posix_func = getattr(posix, name, None)
43 if posix_func is not None:
44 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000045 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000046
Martin v. Löwis7aed61a2009-11-27 14:09:49 +000047 if hasattr(posix, 'getresuid'):
48 def test_getresuid(self):
49 user_ids = posix.getresuid()
50 self.assertEqual(len(user_ids), 3)
51 for val in user_ids:
52 self.assertGreaterEqual(val, 0)
53
54 if hasattr(posix, 'getresgid'):
55 def test_getresgid(self):
56 group_ids = posix.getresgid()
57 self.assertEqual(len(group_ids), 3)
58 for val in group_ids:
59 self.assertGreaterEqual(val, 0)
60
61 if hasattr(posix, 'setresuid'):
62 def test_setresuid(self):
63 current_user_ids = posix.getresuid()
64 self.assertIsNone(posix.setresuid(*current_user_ids))
65 # -1 means don't change that value.
66 self.assertIsNone(posix.setresuid(-1, -1, -1))
67
68 def test_setresuid_exception(self):
69 # Don't do this test if someone is silly enough to run us as root.
70 current_user_ids = posix.getresuid()
71 if 0 not in current_user_ids:
72 new_user_ids = (current_user_ids[0]+1, -1, -1)
73 self.assertRaises(OSError, posix.setresuid, *new_user_ids)
74
75 if hasattr(posix, 'setresgid'):
76 def test_setresgid(self):
77 current_group_ids = posix.getresgid()
78 self.assertIsNone(posix.setresgid(*current_group_ids))
79 # -1 means don't change that value.
80 self.assertIsNone(posix.setresgid(-1, -1, -1))
81
82 def test_setresgid_exception(self):
83 # Don't do this test if someone is silly enough to run us as root.
84 current_group_ids = posix.getresgid()
85 if 0 not in current_group_ids:
86 new_group_ids = (current_group_ids[0]+1, -1, -1)
87 self.assertRaises(OSError, posix.setresgid, *new_group_ids)
88
Antoine Pitroub7572f02009-12-02 20:46:48 +000089 @unittest.skipUnless(hasattr(posix, 'initgroups'),
90 "test needs os.initgroups()")
91 def test_initgroups(self):
92 # It takes a string and an integer; check that it raises a TypeError
93 # for other argument lists.
94 self.assertRaises(TypeError, posix.initgroups)
95 self.assertRaises(TypeError, posix.initgroups, None)
96 self.assertRaises(TypeError, posix.initgroups, 3, "foo")
97 self.assertRaises(TypeError, posix.initgroups, "foo", 3, object())
98
99 # If a non-privileged user invokes it, it should fail with OSError
100 # EPERM.
101 if os.getuid() != 0:
102 name = pwd.getpwuid(posix.getuid()).pw_name
103 try:
104 posix.initgroups(name, 13)
105 except OSError as e:
106 self.assertEquals(e.errno, errno.EPERM)
107 else:
108 self.fail("Expected OSError to be raised by initgroups")
109
Neal Norwitze241ce82003-02-17 18:17:05 +0000110 def test_statvfs(self):
111 if hasattr(posix, 'statvfs'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000112 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000113
114 def test_fstatvfs(self):
115 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000116 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000117 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000118 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000119 finally:
120 fp.close()
121
122 def test_ftruncate(self):
123 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000124 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +0000125 try:
126 # we need to have some data to truncate
127 fp.write('test')
128 fp.flush()
129 posix.ftruncate(fp.fileno(), 0)
130 finally:
131 fp.close()
132
133 def test_dup(self):
134 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000135 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000136 try:
137 fd = posix.dup(fp.fileno())
Ezio Melottie9615932010-01-24 19:26:24 +0000138 self.assertIsInstance(fd, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000139 os.close(fd)
140 finally:
141 fp.close()
142
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000143 def test_confstr(self):
144 if hasattr(posix, 'confstr'):
145 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
146 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
147
Neal Norwitze241ce82003-02-17 18:17:05 +0000148 def test_dup2(self):
149 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000150 fp1 = open(support.TESTFN)
151 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000152 try:
153 posix.dup2(fp1.fileno(), fp2.fileno())
154 finally:
155 fp1.close()
156 fp2.close()
157
Skip Montanaro98470002005-06-17 01:14:49 +0000158 def test_osexlock(self):
159 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000160 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000161 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000162 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000163 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
164 os.close(fd)
165
166 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000167 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000168 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000169 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000170 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
171 os.close(fd)
172
173 def test_osshlock(self):
174 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000175 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000176 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000177 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000178 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
179 os.close(fd2)
180 os.close(fd1)
181
182 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000183 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000184 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000185 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000186 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
187 os.close(fd)
188
Neal Norwitze241ce82003-02-17 18:17:05 +0000189 def test_fstat(self):
190 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000191 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000192 try:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000193 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000194 finally:
195 fp.close()
196
197 def test_stat(self):
198 if hasattr(posix, 'stat'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000199 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000200
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000201 def _test_all_chown_common(self, chown_func, first_param):
202 """Common code for chown, fchown and lchown tests."""
203 if os.getuid() == 0:
204 try:
205 # Many linux distros have a nfsnobody user as MAX_UID-2
206 # that makes a good test case for signedness issues.
207 # http://bugs.python.org/issue1747858
208 # This part of the test only runs when run as root.
209 # Only scary people run their tests as root.
210 ent = pwd.getpwnam('nfsnobody')
211 chown_func(first_param, ent.pw_uid, ent.pw_gid)
212 except KeyError:
213 pass
214 else:
215 # non-root cannot chown to root, raises OSError
216 self.assertRaises(OSError, chown_func,
217 first_param, 0, 0)
218 # test a successful chown call
219 chown_func(first_param, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000220
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000221 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
222 def test_chown(self):
223 # raise an OSError if the file does not exist
224 os.unlink(support.TESTFN)
225 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000226
Benjamin Peterson1baf4652009-12-31 03:11:23 +0000227 # re-create the file
228 open(support.TESTFN, 'w').close()
229 self._test_all_chown_common(posix.chown, support.TESTFN)
230
231 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
232 def test_fchown(self):
233 os.unlink(support.TESTFN)
234
235 # re-create the file
236 test_file = open(support.TESTFN, 'w')
237 try:
238 fd = test_file.fileno()
239 self._test_all_chown_common(posix.fchown, fd)
240 finally:
241 test_file.close()
242
243 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
244 def test_lchown(self):
245 os.unlink(support.TESTFN)
246 # create a symlink
247 os.symlink('/tmp/dummy-symlink-target', support.TESTFN)
248 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000249
Neal Norwitze241ce82003-02-17 18:17:05 +0000250 def test_chdir(self):
251 if hasattr(posix, 'chdir'):
252 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000253 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000254
255 def test_lsdir(self):
256 if hasattr(posix, 'lsdir'):
Benjamin Peterson577473f2010-01-19 00:09:57 +0000257 self.assertIn(support.TESTFN, posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000258
259 def test_access(self):
260 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000261 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000262
263 def test_umask(self):
264 if hasattr(posix, 'umask'):
265 old_mask = posix.umask(0)
Ezio Melottie9615932010-01-24 19:26:24 +0000266 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000267 posix.umask(old_mask)
268
269 def test_strerror(self):
270 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000271 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000272
273 def test_pipe(self):
274 if hasattr(posix, 'pipe'):
275 reader, writer = posix.pipe()
276 os.close(reader)
277 os.close(writer)
278
Neal Norwitze241ce82003-02-17 18:17:05 +0000279 def test_utime(self):
280 if hasattr(posix, 'utime'):
281 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000282 posix.utime(support.TESTFN, None)
283 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
284 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
285 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
286 posix.utime(support.TESTFN, (int(now), int(now)))
287 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000288
Thomas Wouterscf297e42007-02-23 15:07:44 +0000289 def test_chflags(self):
290 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000291 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000292 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000293 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000294
295 def test_lchflags(self):
296 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000297 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000298 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000299 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000300
Guido van Rossum98297ee2007-11-06 21:34:58 +0000301 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000302 if os.name == "nt":
303 item_type = str
304 else:
305 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000306 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000307 self.assertEqual(type(k), item_type)
308 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000309
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000310 def test_getcwd_long_pathnames(self):
311 if hasattr(posix, 'getcwd'):
312 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
313 curdir = os.getcwd()
314 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
315
316 try:
317 os.mkdir(base_path)
318 os.chdir(base_path)
319 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000320# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000321# because the test results in Error in that case.
322# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000323# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000324 return
325
326 def _create_and_do_getcwd(dirname, current_path_length = 0):
327 try:
328 os.mkdir(dirname)
329 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000330 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000331
332 os.chdir(dirname)
333 try:
334 os.getcwd()
335 if current_path_length < 1027:
336 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
337 finally:
338 os.chdir('..')
339 os.rmdir(dirname)
340
341 _create_and_do_getcwd(dirname)
342
343 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000344 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000345 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000346
347
Neal Norwitze241ce82003-02-17 18:17:05 +0000348def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000349 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000350
351if __name__ == '__main__':
352 test_main()