blob: ab78ab6c78d5921625375f7267e48662dc8e4e37 [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
Martin v. Löwisc9e1c7d2010-07-23 12:16:41 +0000255 def test_listdir(self):
256 if hasattr(posix, 'listdir'):
257 self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
258
259 def test_listdir_default(self):
260 # When listdir is called without argument, it's the same as listdir(os.curdir)
261 if hasattr(posix, 'listdir'):
262 self.assertTrue(support.TESTFN in posix.listdir())
Neal Norwitze241ce82003-02-17 18:17:05 +0000263
264 def test_access(self):
265 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000266 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000267
268 def test_umask(self):
269 if hasattr(posix, 'umask'):
270 old_mask = posix.umask(0)
Ezio Melottie9615932010-01-24 19:26:24 +0000271 self.assertIsInstance(old_mask, int)
Neal Norwitze241ce82003-02-17 18:17:05 +0000272 posix.umask(old_mask)
273
274 def test_strerror(self):
275 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000276 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000277
278 def test_pipe(self):
279 if hasattr(posix, 'pipe'):
280 reader, writer = posix.pipe()
281 os.close(reader)
282 os.close(writer)
283
Neal Norwitze241ce82003-02-17 18:17:05 +0000284 def test_utime(self):
285 if hasattr(posix, 'utime'):
286 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000287 posix.utime(support.TESTFN, None)
288 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
289 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
290 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
291 posix.utime(support.TESTFN, (int(now), int(now)))
292 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000293
Thomas Wouterscf297e42007-02-23 15:07:44 +0000294 def test_chflags(self):
295 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000296 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000297 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000298 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000299
300 def test_lchflags(self):
301 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000302 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000303 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000304 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000305
Guido van Rossum98297ee2007-11-06 21:34:58 +0000306 def test_environ(self):
Victor Stinner17b490d2010-05-06 22:19:30 +0000307 if os.name == "nt":
308 item_type = str
309 else:
310 item_type = bytes
Guido van Rossum98297ee2007-11-06 21:34:58 +0000311 for k, v in posix.environ.items():
Victor Stinner17b490d2010-05-06 22:19:30 +0000312 self.assertEqual(type(k), item_type)
313 self.assertEqual(type(v), item_type)
Guido van Rossum98297ee2007-11-06 21:34:58 +0000314
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000315 def test_getcwd_long_pathnames(self):
316 if hasattr(posix, 'getcwd'):
317 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
318 curdir = os.getcwd()
319 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
320
321 try:
322 os.mkdir(base_path)
323 os.chdir(base_path)
324 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000325# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000326# because the test results in Error in that case.
327# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000328# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000329 return
330
331 def _create_and_do_getcwd(dirname, current_path_length = 0):
332 try:
333 os.mkdir(dirname)
334 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000335 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000336
337 os.chdir(dirname)
338 try:
339 os.getcwd()
340 if current_path_length < 1027:
341 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
342 finally:
343 os.chdir('..')
344 os.rmdir(dirname)
345
346 _create_and_do_getcwd(dirname)
347
348 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000349 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000350 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000351
352
Neal Norwitze241ce82003-02-17 18:17:05 +0000353def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000354 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000355
356if __name__ == '__main__':
357 test_main()