blob: b1a9caf9acf23104c7c836dc65e3d16f39503a08 [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
Neal Norwitze241ce82003-02-17 18:17:05 +00004
Neal Norwitze241ce82003-02-17 18:17:05 +00005import time
6import os
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00007import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +00008import shutil
Neal Norwitze241ce82003-02-17 18:17:05 +00009import unittest
10import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000011
12posix = support.import_module('posix')
13
Neal Norwitze241ce82003-02-17 18:17:05 +000014warnings.filterwarnings('ignore', '.* potential security risk .*',
15 RuntimeWarning)
16
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()
23
24 def tearDown(self):
Neal Norwitzc34177c2008-08-25 01:04:16 +000025 support.unlink(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000026
27 def testNoArgFunctions(self):
28 # test posix functions which take no arguments and have
29 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000030 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000031 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000032 "getegid", "geteuid", "getgid", "getgroups",
33 "getpid", "getpgrp", "getppid", "getuid",
34 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000035
Neal Norwitze241ce82003-02-17 18:17:05 +000036 for name in NO_ARG_FUNCTIONS:
37 posix_func = getattr(posix, name, None)
38 if posix_func is not None:
39 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000040 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000041
42 def test_statvfs(self):
43 if hasattr(posix, 'statvfs'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +000044 self.assert_(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +000045
46 def test_fstatvfs(self):
47 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000048 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000049 try:
Neal Norwitz2ff51a82003-02-17 22:40:31 +000050 self.assert_(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +000051 finally:
52 fp.close()
53
54 def test_ftruncate(self):
55 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000056 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000057 try:
58 # we need to have some data to truncate
59 fp.write('test')
60 fp.flush()
61 posix.ftruncate(fp.fileno(), 0)
62 finally:
63 fp.close()
64
65 def test_dup(self):
66 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000067 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000068 try:
69 fd = posix.dup(fp.fileno())
Neal Norwitz2ff51a82003-02-17 22:40:31 +000070 self.assert_(isinstance(fd, int))
Neal Norwitze241ce82003-02-17 18:17:05 +000071 os.close(fd)
72 finally:
73 fp.close()
74
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000075 def test_confstr(self):
76 if hasattr(posix, 'confstr'):
77 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
78 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
79
Neal Norwitze241ce82003-02-17 18:17:05 +000080 def test_dup2(self):
81 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000082 fp1 = open(support.TESTFN)
83 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000084 try:
85 posix.dup2(fp1.fileno(), fp2.fileno())
86 finally:
87 fp1.close()
88 fp2.close()
89
Skip Montanaro98470002005-06-17 01:14:49 +000090 def test_osexlock(self):
91 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000092 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000093 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000094 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000095 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
96 os.close(fd)
97
98 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000099 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000100 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000101 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000102 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
103 os.close(fd)
104
105 def test_osshlock(self):
106 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000107 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000108 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000109 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000110 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
111 os.close(fd2)
112 os.close(fd1)
113
114 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000115 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000116 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000117 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000118 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
119 os.close(fd)
120
Neal Norwitze241ce82003-02-17 18:17:05 +0000121 def test_fstat(self):
122 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000123 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000124 try:
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000125 self.assert_(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000126 finally:
127 fp.close()
128
129 def test_stat(self):
130 if hasattr(posix, 'stat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000131 self.assert_(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000132
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000133 if hasattr(posix, 'chown'):
134 def test_chown(self):
135 # raise an OSError if the file does not exist
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000136 os.unlink(support.TESTFN)
137 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000138
139 # re-create the file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000140 open(support.TESTFN, 'w').close()
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000141 if os.getuid() == 0:
142 try:
143 # Many linux distros have a nfsnobody user as MAX_UID-2
144 # that makes a good test case for signedness issues.
145 # http://bugs.python.org/issue1747858
146 # This part of the test only runs when run as root.
147 # Only scary people run their tests as root.
148 ent = pwd.getpwnam('nfsnobody')
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000149 posix.chown(support.TESTFN, ent.pw_uid, ent.pw_gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000150 except KeyError:
151 pass
152 else:
153 # non-root cannot chown to root, raises OSError
154 self.assertRaises(OSError, posix.chown,
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000155 support.TESTFN, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000156
157 # test a successful chown call
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000158 posix.chown(support.TESTFN, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000159
Neal Norwitze241ce82003-02-17 18:17:05 +0000160 def test_chdir(self):
161 if hasattr(posix, 'chdir'):
162 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000163 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000164
165 def test_lsdir(self):
166 if hasattr(posix, 'lsdir'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000167 self.assert_(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000168
169 def test_access(self):
170 if hasattr(posix, 'access'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000171 self.assert_(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000172
173 def test_umask(self):
174 if hasattr(posix, 'umask'):
175 old_mask = posix.umask(0)
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000176 self.assert_(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000177 posix.umask(old_mask)
178
179 def test_strerror(self):
180 if hasattr(posix, 'strerror'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000181 self.assert_(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000182
183 def test_pipe(self):
184 if hasattr(posix, 'pipe'):
185 reader, writer = posix.pipe()
186 os.close(reader)
187 os.close(writer)
188
Neal Norwitze241ce82003-02-17 18:17:05 +0000189 def test_utime(self):
190 if hasattr(posix, 'utime'):
191 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000192 posix.utime(support.TESTFN, None)
193 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
194 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
195 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
196 posix.utime(support.TESTFN, (int(now), int(now)))
197 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000198
Thomas Wouterscf297e42007-02-23 15:07:44 +0000199 def test_chflags(self):
200 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000201 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000202 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000203 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000204
205 def test_lchflags(self):
206 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000207 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000208 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000209 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000210
Guido van Rossum98297ee2007-11-06 21:34:58 +0000211 def test_environ(self):
212 for k, v in posix.environ.items():
213 self.assertEqual(type(k), str)
214 self.assertEqual(type(v), str)
215
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000216 def test_getcwd_long_pathnames(self):
217 if hasattr(posix, 'getcwd'):
218 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
219 curdir = os.getcwd()
220 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
221
222 try:
223 os.mkdir(base_path)
224 os.chdir(base_path)
225 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000226# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000227# because the test results in Error in that case.
228# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000229# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000230 return
231
232 def _create_and_do_getcwd(dirname, current_path_length = 0):
233 try:
234 os.mkdir(dirname)
235 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000236 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000237
238 os.chdir(dirname)
239 try:
240 os.getcwd()
241 if current_path_length < 1027:
242 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
243 finally:
244 os.chdir('..')
245 os.rmdir(dirname)
246
247 _create_and_do_getcwd(dirname)
248
249 finally:
Neal Norwitzc34177c2008-08-25 01:04:16 +0000250 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000251 os.chdir(curdir)
252
253
Neal Norwitze241ce82003-02-17 18:17:05 +0000254def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000255 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000256
257if __name__ == '__main__':
258 test_main()