blob: 78f7592a1d340d141a29577f22f6741b45063de2 [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
Neal Norwitze241ce82003-02-17 18:17:05 +00008import time
9import os
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000010import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000011import shutil
Neal Norwitze241ce82003-02-17 18:17:05 +000012import unittest
13import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000014
Neal Norwitze241ce82003-02-17 18:17:05 +000015warnings.filterwarnings('ignore', '.* potential security risk .*',
16 RuntimeWarning)
17
18class PosixTester(unittest.TestCase):
19
20 def setUp(self):
21 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000022 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000023 fp.close()
24
25 def tearDown(self):
Neal Norwitzc34177c2008-08-25 01:04:16 +000026 support.unlink(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000027
28 def testNoArgFunctions(self):
29 # test posix functions which take no arguments and have
30 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000031 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000032 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000033 "getegid", "geteuid", "getgid", "getgroups",
34 "getpid", "getpgrp", "getppid", "getuid",
35 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000036
Neal Norwitze241ce82003-02-17 18:17:05 +000037 for name in NO_ARG_FUNCTIONS:
38 posix_func = getattr(posix, name, None)
39 if posix_func is not None:
40 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000041 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000042
43 def test_statvfs(self):
44 if hasattr(posix, 'statvfs'):
Georg Brandlab91fde2009-08-13 08:51:18 +000045 self.assertTrue(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +000046
47 def test_fstatvfs(self):
48 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000049 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000050 try:
Georg Brandlab91fde2009-08-13 08:51:18 +000051 self.assertTrue(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +000052 finally:
53 fp.close()
54
55 def test_ftruncate(self):
56 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000057 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000058 try:
59 # we need to have some data to truncate
60 fp.write('test')
61 fp.flush()
62 posix.ftruncate(fp.fileno(), 0)
63 finally:
64 fp.close()
65
66 def test_dup(self):
67 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000068 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000069 try:
70 fd = posix.dup(fp.fileno())
Georg Brandlab91fde2009-08-13 08:51:18 +000071 self.assertTrue(isinstance(fd, int))
Neal Norwitze241ce82003-02-17 18:17:05 +000072 os.close(fd)
73 finally:
74 fp.close()
75
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000076 def test_confstr(self):
77 if hasattr(posix, 'confstr'):
78 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
79 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
80
Neal Norwitze241ce82003-02-17 18:17:05 +000081 def test_dup2(self):
82 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000083 fp1 = open(support.TESTFN)
84 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000085 try:
86 posix.dup2(fp1.fileno(), fp2.fileno())
87 finally:
88 fp1.close()
89 fp2.close()
90
Skip Montanaro98470002005-06-17 01:14:49 +000091 def test_osexlock(self):
92 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000093 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000094 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000095 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000096 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
97 os.close(fd)
98
99 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000100 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000101 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000102 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000103 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
104 os.close(fd)
105
106 def test_osshlock(self):
107 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000108 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000109 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000110 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000111 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
112 os.close(fd2)
113 os.close(fd1)
114
115 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000116 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000117 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000118 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000119 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
120 os.close(fd)
121
Neal Norwitze241ce82003-02-17 18:17:05 +0000122 def test_fstat(self):
123 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000124 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000125 try:
Georg Brandlab91fde2009-08-13 08:51:18 +0000126 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000127 finally:
128 fp.close()
129
130 def test_stat(self):
131 if hasattr(posix, 'stat'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000132 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000133
Benjamin Peterson68dbebc2009-12-31 03:30:26 +0000134 def _test_all_chown_common(self, chown_func, first_param):
135 """Common code for chown, fchown and lchown tests."""
136 if os.getuid() == 0:
137 try:
138 # Many linux distros have a nfsnobody user as MAX_UID-2
139 # that makes a good test case for signedness issues.
140 # http://bugs.python.org/issue1747858
141 # This part of the test only runs when run as root.
142 # Only scary people run their tests as root.
143 ent = pwd.getpwnam('nfsnobody')
144 chown_func(first_param, ent.pw_uid, ent.pw_gid)
145 except KeyError:
146 pass
147 else:
148 # non-root cannot chown to root, raises OSError
149 self.assertRaises(OSError, chown_func,
150 first_param, 0, 0)
151 # test a successful chown call
152 chown_func(first_param, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000153
Benjamin Peterson68dbebc2009-12-31 03:30:26 +0000154 @unittest.skipUnless(hasattr(posix, 'chown'), "test needs os.chown()")
155 def test_chown(self):
156 # raise an OSError if the file does not exist
157 os.unlink(support.TESTFN)
158 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000159
Benjamin Peterson68dbebc2009-12-31 03:30:26 +0000160 # re-create the file
161 open(support.TESTFN, 'w').close()
162 self._test_all_chown_common(posix.chown, support.TESTFN)
163
164 @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
165 def test_fchown(self):
166 os.unlink(support.TESTFN)
167
168 # re-create the file
169 test_file = open(support.TESTFN, 'w')
170 try:
171 fd = test_file.fileno()
172 self._test_all_chown_common(posix.fchown, fd)
173 finally:
174 test_file.close()
175
176 @unittest.skipUnless(hasattr(posix, 'lchown'), "test needs os.lchown()")
177 def test_lchown(self):
178 os.unlink(support.TESTFN)
179 # create a symlink
180 os.symlink('/tmp/dummy-symlink-target', support.TESTFN)
181 self._test_all_chown_common(posix.lchown, support.TESTFN)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000182
Neal Norwitze241ce82003-02-17 18:17:05 +0000183 def test_chdir(self):
184 if hasattr(posix, 'chdir'):
185 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000186 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000187
188 def test_lsdir(self):
189 if hasattr(posix, 'lsdir'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000190 self.assertTrue(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000191
192 def test_access(self):
193 if hasattr(posix, 'access'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000194 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000195
196 def test_umask(self):
197 if hasattr(posix, 'umask'):
198 old_mask = posix.umask(0)
Georg Brandlab91fde2009-08-13 08:51:18 +0000199 self.assertTrue(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000200 posix.umask(old_mask)
201
202 def test_strerror(self):
203 if hasattr(posix, 'strerror'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000204 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000205
206 def test_pipe(self):
207 if hasattr(posix, 'pipe'):
208 reader, writer = posix.pipe()
209 os.close(reader)
210 os.close(writer)
211
Neal Norwitze241ce82003-02-17 18:17:05 +0000212 def test_utime(self):
213 if hasattr(posix, 'utime'):
214 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000215 posix.utime(support.TESTFN, None)
216 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
217 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
218 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
219 posix.utime(support.TESTFN, (int(now), int(now)))
220 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000221
Thomas Wouterscf297e42007-02-23 15:07:44 +0000222 def test_chflags(self):
223 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000224 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000225 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000226 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000227
228 def test_lchflags(self):
229 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000230 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000231 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000232 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000233
Guido van Rossum98297ee2007-11-06 21:34:58 +0000234 def test_environ(self):
235 for k, v in posix.environ.items():
236 self.assertEqual(type(k), str)
237 self.assertEqual(type(v), str)
238
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000239 def test_getcwd_long_pathnames(self):
240 if hasattr(posix, 'getcwd'):
241 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
242 curdir = os.getcwd()
243 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
244
245 try:
246 os.mkdir(base_path)
247 os.chdir(base_path)
248 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000249# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000250# because the test results in Error in that case.
251# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000252# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000253 return
254
255 def _create_and_do_getcwd(dirname, current_path_length = 0):
256 try:
257 os.mkdir(dirname)
258 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000259 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000260
261 os.chdir(dirname)
262 try:
263 os.getcwd()
264 if current_path_length < 1027:
265 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
266 finally:
267 os.chdir('..')
268 os.rmdir(dirname)
269
270 _create_and_do_getcwd(dirname)
271
272 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000273 os.chdir(curdir)
R. David Murray28a60012009-07-09 20:31:08 +0000274 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000275
276
Neal Norwitze241ce82003-02-17 18:17:05 +0000277def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000278 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000279
280if __name__ == '__main__':
281 test_main()