blob: b7ce71eda4a6b2de3fce54bc9358c53aba688737 [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
5try:
6 import posix
7except ImportError:
Benjamin Petersonee8712c2008-05-20 21:35:26 +00008 raise support.TestSkipped("posix is not available")
Neal Norwitze241ce82003-02-17 18:17:05 +00009
10import time
11import os
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000012import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000013import shutil
Neal Norwitze241ce82003-02-17 18:17:05 +000014import unittest
15import warnings
16warnings.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):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000027 os.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)
32 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdu", "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'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +000046 self.assert_(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:
Neal Norwitz2ff51a82003-02-17 22:40:31 +000052 self.assert_(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())
Neal Norwitz2ff51a82003-02-17 22:40:31 +000072 self.assert_(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
92 def fdopen_helper(self, *args):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000093 fd = os.open(support.TESTFN, os.O_RDONLY)
Neal Norwitze241ce82003-02-17 18:17:05 +000094 fp2 = posix.fdopen(fd, *args)
95 fp2.close()
96
97 def test_fdopen(self):
98 if hasattr(posix, 'fdopen'):
99 self.fdopen_helper()
100 self.fdopen_helper('r')
101 self.fdopen_helper('r', 100)
102
Skip Montanaro98470002005-06-17 01:14:49 +0000103 def test_osexlock(self):
104 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000105 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000106 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000107 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000108 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
109 os.close(fd)
110
111 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000112 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000113 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000114 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000115 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
116 os.close(fd)
117
118 def test_osshlock(self):
119 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000120 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000121 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000122 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000123 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
124 os.close(fd2)
125 os.close(fd1)
126
127 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000128 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000129 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000130 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000131 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
132 os.close(fd)
133
Neal Norwitze241ce82003-02-17 18:17:05 +0000134 def test_fstat(self):
135 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000136 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000137 try:
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000138 self.assert_(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000139 finally:
140 fp.close()
141
142 def test_stat(self):
143 if hasattr(posix, 'stat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000144 self.assert_(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000145
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000146 if hasattr(posix, 'chown'):
147 def test_chown(self):
148 # raise an OSError if the file does not exist
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000149 os.unlink(support.TESTFN)
150 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000151
152 # re-create the file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000153 open(support.TESTFN, 'w').close()
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000154 if os.getuid() == 0:
155 try:
156 # Many linux distros have a nfsnobody user as MAX_UID-2
157 # that makes a good test case for signedness issues.
158 # http://bugs.python.org/issue1747858
159 # This part of the test only runs when run as root.
160 # Only scary people run their tests as root.
161 ent = pwd.getpwnam('nfsnobody')
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000162 posix.chown(support.TESTFN, ent.pw_uid, ent.pw_gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000163 except KeyError:
164 pass
165 else:
166 # non-root cannot chown to root, raises OSError
167 self.assertRaises(OSError, posix.chown,
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000168 support.TESTFN, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000169
170 # test a successful chown call
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000171 posix.chown(support.TESTFN, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000172
Neal Norwitze241ce82003-02-17 18:17:05 +0000173 def test_chdir(self):
174 if hasattr(posix, 'chdir'):
175 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000176 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000177
178 def test_lsdir(self):
179 if hasattr(posix, 'lsdir'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000180 self.assert_(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000181
182 def test_access(self):
183 if hasattr(posix, 'access'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000184 self.assert_(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000185
186 def test_umask(self):
187 if hasattr(posix, 'umask'):
188 old_mask = posix.umask(0)
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000189 self.assert_(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000190 posix.umask(old_mask)
191
192 def test_strerror(self):
193 if hasattr(posix, 'strerror'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000194 self.assert_(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000195
196 def test_pipe(self):
197 if hasattr(posix, 'pipe'):
198 reader, writer = posix.pipe()
199 os.close(reader)
200 os.close(writer)
201
Neal Norwitze241ce82003-02-17 18:17:05 +0000202 def test_utime(self):
203 if hasattr(posix, 'utime'):
204 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000205 posix.utime(support.TESTFN, None)
206 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
207 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
208 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
209 posix.utime(support.TESTFN, (int(now), int(now)))
210 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000211
Thomas Wouterscf297e42007-02-23 15:07:44 +0000212 def test_chflags(self):
213 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000214 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000215 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000216 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000217
218 def test_lchflags(self):
219 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000220 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000221 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000222 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000223
Guido van Rossum98297ee2007-11-06 21:34:58 +0000224 def test_environ(self):
225 for k, v in posix.environ.items():
226 self.assertEqual(type(k), str)
227 self.assertEqual(type(v), str)
228
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000229 def test_getcwd_long_pathnames(self):
230 if hasattr(posix, 'getcwd'):
231 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
232 curdir = os.getcwd()
233 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
234
235 try:
236 os.mkdir(base_path)
237 os.chdir(base_path)
238 except:
239# Just returning nothing instead of the TestSkipped exception,
240# because the test results in Error in that case.
241# Is that ok?
242# raise support.TestSkipped, "cannot create directory for testing"
243 return
244
245 def _create_and_do_getcwd(dirname, current_path_length = 0):
246 try:
247 os.mkdir(dirname)
248 except:
249 raise support.TestSkipped("mkdir cannot create directory sufficiently deep for getcwd test")
250
251 os.chdir(dirname)
252 try:
253 os.getcwd()
254 if current_path_length < 1027:
255 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
256 finally:
257 os.chdir('..')
258 os.rmdir(dirname)
259
260 _create_and_do_getcwd(dirname)
261
262 finally:
263 shutil.rmtree(base_path)
264 os.chdir(curdir)
265
266
Neal Norwitze241ce82003-02-17 18:17:05 +0000267def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000268 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000269
270if __name__ == '__main__':
271 test_main()