blob: 2a0a876846f74bf6ec6eaaf0cf1bca258b7be8e4 [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 Petersone549ead2009-03-28 21:42:05 +00008 raise unittest.SkipTest("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):
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'):
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
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:
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000127 self.assert_(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'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000133 self.assert_(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000134
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000135 if hasattr(posix, 'chown'):
136 def test_chown(self):
137 # raise an OSError if the file does not exist
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000138 os.unlink(support.TESTFN)
139 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000140
141 # re-create the file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000142 open(support.TESTFN, 'w').close()
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000143 if os.getuid() == 0:
144 try:
145 # Many linux distros have a nfsnobody user as MAX_UID-2
146 # that makes a good test case for signedness issues.
147 # http://bugs.python.org/issue1747858
148 # This part of the test only runs when run as root.
149 # Only scary people run their tests as root.
150 ent = pwd.getpwnam('nfsnobody')
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000151 posix.chown(support.TESTFN, ent.pw_uid, ent.pw_gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000152 except KeyError:
153 pass
154 else:
155 # non-root cannot chown to root, raises OSError
156 self.assertRaises(OSError, posix.chown,
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000157 support.TESTFN, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000158
159 # test a successful chown call
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000160 posix.chown(support.TESTFN, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000161
Neal Norwitze241ce82003-02-17 18:17:05 +0000162 def test_chdir(self):
163 if hasattr(posix, 'chdir'):
164 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000165 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000166
167 def test_lsdir(self):
168 if hasattr(posix, 'lsdir'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000169 self.assert_(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000170
171 def test_access(self):
172 if hasattr(posix, 'access'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000173 self.assert_(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000174
175 def test_umask(self):
176 if hasattr(posix, 'umask'):
177 old_mask = posix.umask(0)
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000178 self.assert_(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000179 posix.umask(old_mask)
180
181 def test_strerror(self):
182 if hasattr(posix, 'strerror'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000183 self.assert_(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000184
185 def test_pipe(self):
186 if hasattr(posix, 'pipe'):
187 reader, writer = posix.pipe()
188 os.close(reader)
189 os.close(writer)
190
Neal Norwitze241ce82003-02-17 18:17:05 +0000191 def test_utime(self):
192 if hasattr(posix, 'utime'):
193 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000194 posix.utime(support.TESTFN, None)
195 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
196 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
197 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
198 posix.utime(support.TESTFN, (int(now), int(now)))
199 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000200
Thomas Wouterscf297e42007-02-23 15:07:44 +0000201 def test_chflags(self):
202 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000203 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000204 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000205 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000206
207 def test_lchflags(self):
208 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000209 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000210 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000211 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000212
Guido van Rossum98297ee2007-11-06 21:34:58 +0000213 def test_environ(self):
214 for k, v in posix.environ.items():
215 self.assertEqual(type(k), str)
216 self.assertEqual(type(v), str)
217
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000218 def test_getcwd_long_pathnames(self):
219 if hasattr(posix, 'getcwd'):
220 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
221 curdir = os.getcwd()
222 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
223
224 try:
225 os.mkdir(base_path)
226 os.chdir(base_path)
227 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000228# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000229# because the test results in Error in that case.
230# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000231# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000232 return
233
234 def _create_and_do_getcwd(dirname, current_path_length = 0):
235 try:
236 os.mkdir(dirname)
237 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000238 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000239
240 os.chdir(dirname)
241 try:
242 os.getcwd()
243 if current_path_length < 1027:
244 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
245 finally:
246 os.chdir('..')
247 os.rmdir(dirname)
248
249 _create_and_do_getcwd(dirname)
250
251 finally:
Neal Norwitzc34177c2008-08-25 01:04:16 +0000252 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000253 os.chdir(curdir)
254
255
Neal Norwitze241ce82003-02-17 18:17:05 +0000256def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000257 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000258
259if __name__ == '__main__':
260 test_main()