blob: 3a404833327a7fa127ad1d7df376ae45686b3270 [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
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000198 if hasattr(posix, 'chown'):
199 def test_chown(self):
200 # raise an OSError if the file does not exist
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000201 os.unlink(support.TESTFN)
202 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000203
204 # re-create the file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000205 open(support.TESTFN, 'w').close()
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000206 if os.getuid() == 0:
207 try:
208 # Many linux distros have a nfsnobody user as MAX_UID-2
209 # that makes a good test case for signedness issues.
210 # http://bugs.python.org/issue1747858
211 # This part of the test only runs when run as root.
212 # Only scary people run their tests as root.
213 ent = pwd.getpwnam('nfsnobody')
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000214 posix.chown(support.TESTFN, ent.pw_uid, ent.pw_gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000215 except KeyError:
216 pass
217 else:
218 # non-root cannot chown to root, raises OSError
219 self.assertRaises(OSError, posix.chown,
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000220 support.TESTFN, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000221
222 # test a successful chown call
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000223 posix.chown(support.TESTFN, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000224
Neal Norwitze241ce82003-02-17 18:17:05 +0000225 def test_chdir(self):
226 if hasattr(posix, 'chdir'):
227 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000228 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000229
230 def test_lsdir(self):
231 if hasattr(posix, 'lsdir'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000232 self.assertTrue(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000233
234 def test_access(self):
235 if hasattr(posix, 'access'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000236 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000237
238 def test_umask(self):
239 if hasattr(posix, 'umask'):
240 old_mask = posix.umask(0)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000241 self.assertTrue(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000242 posix.umask(old_mask)
243
244 def test_strerror(self):
245 if hasattr(posix, 'strerror'):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000246 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000247
248 def test_pipe(self):
249 if hasattr(posix, 'pipe'):
250 reader, writer = posix.pipe()
251 os.close(reader)
252 os.close(writer)
253
Neal Norwitze241ce82003-02-17 18:17:05 +0000254 def test_utime(self):
255 if hasattr(posix, 'utime'):
256 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000257 posix.utime(support.TESTFN, None)
258 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
259 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
260 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
261 posix.utime(support.TESTFN, (int(now), int(now)))
262 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000263
Thomas Wouterscf297e42007-02-23 15:07:44 +0000264 def test_chflags(self):
265 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000266 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000267 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000268 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000269
270 def test_lchflags(self):
271 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000272 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000273 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000274 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000275
Guido van Rossum98297ee2007-11-06 21:34:58 +0000276 def test_environ(self):
277 for k, v in posix.environ.items():
278 self.assertEqual(type(k), str)
279 self.assertEqual(type(v), str)
280
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000281 def test_getcwd_long_pathnames(self):
282 if hasattr(posix, 'getcwd'):
283 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
284 curdir = os.getcwd()
285 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
286
287 try:
288 os.mkdir(base_path)
289 os.chdir(base_path)
290 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000291# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000292# because the test results in Error in that case.
293# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000294# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000295 return
296
297 def _create_and_do_getcwd(dirname, current_path_length = 0):
298 try:
299 os.mkdir(dirname)
300 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000301 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000302
303 os.chdir(dirname)
304 try:
305 os.getcwd()
306 if current_path_length < 1027:
307 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
308 finally:
309 os.chdir('..')
310 os.rmdir(dirname)
311
312 _create_and_do_getcwd(dirname)
313
314 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000315 os.chdir(curdir)
R. David Murray414c91f2009-07-09 20:12:31 +0000316 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000317
318
Neal Norwitze241ce82003-02-17 18:17:05 +0000319def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000320 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000321
322if __name__ == '__main__':
323 test_main()