blob: 51cc23ce0508491ffc6fa6d4d46ae3c468569ed7 [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
Ronald Oussoren47076f72010-07-23 15:46:03 +00008import sys
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
44 def test_statvfs(self):
45 if hasattr(posix, 'statvfs'):
Georg Brandlab91fde2009-08-13 08:51:18 +000046 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +000047
48 def test_fstatvfs(self):
49 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000050 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000051 try:
Georg Brandlab91fde2009-08-13 08:51:18 +000052 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +000053 finally:
54 fp.close()
55
56 def test_ftruncate(self):
57 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000058 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000059 try:
60 # we need to have some data to truncate
61 fp.write('test')
62 fp.flush()
63 posix.ftruncate(fp.fileno(), 0)
64 finally:
65 fp.close()
66
67 def test_dup(self):
68 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000069 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000070 try:
71 fd = posix.dup(fp.fileno())
Georg Brandlab91fde2009-08-13 08:51:18 +000072 self.assertTrue(isinstance(fd, int))
Neal Norwitze241ce82003-02-17 18:17:05 +000073 os.close(fd)
74 finally:
75 fp.close()
76
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000077 def test_confstr(self):
78 if hasattr(posix, 'confstr'):
79 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
80 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
81
Neal Norwitze241ce82003-02-17 18:17:05 +000082 def test_dup2(self):
83 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000084 fp1 = open(support.TESTFN)
85 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000086 try:
87 posix.dup2(fp1.fileno(), fp2.fileno())
88 finally:
89 fp1.close()
90 fp2.close()
91
Skip Montanaro98470002005-06-17 01:14:49 +000092 def test_osexlock(self):
93 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000094 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000095 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000096 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000097 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
98 os.close(fd)
99
100 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000101 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000102 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000103 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000104 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
105 os.close(fd)
106
107 def test_osshlock(self):
108 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000109 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000110 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000111 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000112 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
113 os.close(fd2)
114 os.close(fd1)
115
116 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000117 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000118 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000119 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000120 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
121 os.close(fd)
122
Neal Norwitze241ce82003-02-17 18:17:05 +0000123 def test_fstat(self):
124 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000125 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000126 try:
Georg Brandlab91fde2009-08-13 08:51:18 +0000127 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000128 finally:
129 fp.close()
130
131 def test_stat(self):
132 if hasattr(posix, 'stat'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000133 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000134
Benjamin Peterson68dbebc2009-12-31 03:30:26 +0000135 def _test_all_chown_common(self, chown_func, first_param):
136 """Common code for chown, fchown and lchown tests."""
137 if os.getuid() == 0:
138 try:
139 # Many linux distros have a nfsnobody user as MAX_UID-2
140 # that makes a good test case for signedness issues.
141 # http://bugs.python.org/issue1747858
142 # This part of the test only runs when run as root.
143 # Only scary people run their tests as root.
144 ent = pwd.getpwnam('nfsnobody')
145 chown_func(first_param, ent.pw_uid, ent.pw_gid)
146 except KeyError:
147 pass
148 else:
149 # non-root cannot chown to root, raises OSError
150 self.assertRaises(OSError, chown_func,
151 first_param, 0, 0)
152 # test a successful chown call
153 chown_func(first_param, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000154
Benjamin Peterson68dbebc2009-12-31 03:30:26 +0000155 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
156 def test_chown(self):
157 # raise an OSError if the file does not exist
158 os.unlink(support.TESTFN)
159 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000160
Benjamin Peterson68dbebc2009-12-31 03:30:26 +0000161 # re-create the file
162 open(support.TESTFN, 'w').close()
163 self._test_all_chown_common(posix.chown, support.TESTFN)
164
165 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
166 def test_fchown(self):
167 os.unlink(support.TESTFN)
168
169 # re-create the file
170 test_file = open(support.TESTFN, 'w')
171 try:
172 fd = test_file.fileno()
173 self._test_all_chown_common(posix.fchown, fd)
174 finally:
175 test_file.close()
176
177 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
178 def test_lchown(self):
179 os.unlink(support.TESTFN)
180 # create a symlink
181 os.symlink('/tmp/dummy-symlink-target', support.TESTFN)
182 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000183
Neal Norwitze241ce82003-02-17 18:17:05 +0000184 def test_chdir(self):
185 if hasattr(posix, 'chdir'):
186 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000187 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000188
189 def test_lsdir(self):
190 if hasattr(posix, 'lsdir'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000191 self.assertTrue(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000192
193 def test_access(self):
194 if hasattr(posix, 'access'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000195 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000196
197 def test_umask(self):
198 if hasattr(posix, 'umask'):
199 old_mask = posix.umask(0)
Georg Brandlab91fde2009-08-13 08:51:18 +0000200 self.assertTrue(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000201 posix.umask(old_mask)
202
203 def test_strerror(self):
204 if hasattr(posix, 'strerror'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000205 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000206
207 def test_pipe(self):
208 if hasattr(posix, 'pipe'):
209 reader, writer = posix.pipe()
210 os.close(reader)
211 os.close(writer)
212
Neal Norwitze241ce82003-02-17 18:17:05 +0000213 def test_utime(self):
214 if hasattr(posix, 'utime'):
215 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000216 posix.utime(support.TESTFN, None)
217 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
218 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
219 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
220 posix.utime(support.TESTFN, (int(now), int(now)))
221 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000222
Thomas Wouterscf297e42007-02-23 15:07:44 +0000223 def test_chflags(self):
224 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000225 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000226 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000227 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000228
229 def test_lchflags(self):
230 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000231 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000232 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000233 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000234
Guido van Rossum98297ee2007-11-06 21:34:58 +0000235 def test_environ(self):
236 for k, v in posix.environ.items():
237 self.assertEqual(type(k), str)
238 self.assertEqual(type(v), str)
239
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000240 def test_getcwd_long_pathnames(self):
241 if hasattr(posix, 'getcwd'):
242 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
243 curdir = os.getcwd()
244 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
245
246 try:
247 os.mkdir(base_path)
248 os.chdir(base_path)
249 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000250# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000251# because the test results in Error in that case.
252# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000253# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000254 return
255
256 def _create_and_do_getcwd(dirname, current_path_length = 0):
257 try:
258 os.mkdir(dirname)
259 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000260 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000261
262 os.chdir(dirname)
263 try:
264 os.getcwd()
265 if current_path_length < 1027:
266 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
267 finally:
268 os.chdir('..')
269 os.rmdir(dirname)
270
271 _create_and_do_getcwd(dirname)
272
273 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000274 os.chdir(curdir)
R. David Murray28a60012009-07-09 20:31:08 +0000275 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000276
Antoine Pitroub633eab2011-01-12 18:50:35 +0000277 @unittest.skipUnless(hasattr(os, 'getegid'), "test needs os.getegid()")
Ronald Oussoren47076f72010-07-23 15:46:03 +0000278 def test_getgroups(self):
279 with os.popen('id -G') as idg:
280 groups = idg.read().strip()
281
282 if not groups:
283 raise unittest.SkipTest("need working 'id -G'")
284
Georg Brandl5f6f6eb2010-08-01 20:55:37 +0000285 # 'id -G' and 'os.getgroups()' should return the same
286 # groups, ignoring order and duplicates.
Antoine Pitroub633eab2011-01-12 18:50:35 +0000287 # #10822 - it is implementation defined whether posix.getgroups()
288 # includes the effective gid so we include it anyway, since id -G does
Ronald Oussoren55b9da52010-07-24 14:19:26 +0000289 self.assertEqual(
Georg Brandl5f6f6eb2010-08-01 20:55:37 +0000290 set([int(x) for x in groups.split()]),
Antoine Pitroub633eab2011-01-12 18:50:35 +0000291 set(posix.getgroups() + [posix.getegid()]))
Ronald Oussoren47076f72010-07-23 15:46:03 +0000292
293class PosixGroupsTester(unittest.TestCase):
294
295 def setUp(self):
296 if posix.getuid() != 0:
297 raise unittest.SkipTest("not enough privileges")
298 if not hasattr(posix, 'getgroups'):
299 raise unittest.SkipTest("need posix.getgroups")
300 if sys.platform == 'darwin':
301 raise unittest.SkipTest("getgroups(2) is broken on OSX")
302 self.saved_groups = posix.getgroups()
303
304 def tearDown(self):
305 if hasattr(posix, 'setgroups'):
306 posix.setgroups(self.saved_groups)
307 elif hasattr(posix, 'initgroups'):
308 name = pwd.getpwuid(posix.getuid()).pw_name
309 posix.initgroups(name, self.saved_groups[0])
310
311 @unittest.skipUnless(hasattr(posix, 'initgroups'),
312 "test needs posix.initgroups()")
313 def test_initgroups(self):
314 # find missing group
315
Antoine Pitrou5c78eda2010-09-04 17:33:06 +0000316 g = max(self.saved_groups) + 1
Ronald Oussoren47076f72010-07-23 15:46:03 +0000317 name = pwd.getpwuid(posix.getuid()).pw_name
318 posix.initgroups(name, g)
319 self.assertIn(g, posix.getgroups())
320
321 @unittest.skipUnless(hasattr(posix, 'setgroups'),
322 "test needs posix.setgroups()")
323 def test_setgroups(self):
Antoine Pitrou5c78eda2010-09-04 17:33:06 +0000324 for groups in [[0], list(range(16))]:
Ronald Oussoren47076f72010-07-23 15:46:03 +0000325 posix.setgroups(groups)
326 self.assertListEqual(groups, posix.getgroups())
327
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000328
Neal Norwitze241ce82003-02-17 18:17:05 +0000329def test_main():
Ronald Oussoren47076f72010-07-23 15:46:03 +0000330 support.run_unittest(PosixTester, PosixGroupsTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000331
332if __name__ == '__main__':
333 test_main()