blob: ff9b106e1c47f5d21ee3b1335c38f8be57fcf3fa [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
Kristján Valur Jónsson42a40c52009-04-01 11:28:47 +00004posix = support.import_module('posix') #skip if not supported
Neal Norwitze241ce82003-02-17 18:17:05 +00005
Neal Norwitze241ce82003-02-17 18:17:05 +00006import time
7import os
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00008import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +00009import shutil
Neal Norwitze241ce82003-02-17 18:17:05 +000010import unittest
11import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000012
Neal Norwitze241ce82003-02-17 18:17:05 +000013warnings.filterwarnings('ignore', '.* potential security risk .*',
14 RuntimeWarning)
15
16class PosixTester(unittest.TestCase):
17
18 def setUp(self):
19 # create empty file
Benjamin Petersonee8712c2008-05-20 21:35:26 +000020 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000021 fp.close()
22
23 def tearDown(self):
Neal Norwitzc34177c2008-08-25 01:04:16 +000024 support.unlink(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000025
26 def testNoArgFunctions(self):
27 # test posix functions which take no arguments and have
28 # no side-effects which we need to cleanup (e.g., fork, wait, abort)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000029 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "uname",
Guido van Rossum687b9c02007-10-25 23:18:51 +000030 "times", "getloadavg",
Neal Norwitze241ce82003-02-17 18:17:05 +000031 "getegid", "geteuid", "getgid", "getgroups",
32 "getpid", "getpgrp", "getppid", "getuid",
33 ]
Neal Norwitz71b13e82003-02-23 22:12:24 +000034
Neal Norwitze241ce82003-02-17 18:17:05 +000035 for name in NO_ARG_FUNCTIONS:
36 posix_func = getattr(posix, name, None)
37 if posix_func is not None:
38 posix_func()
Neal Norwitz2ff51a82003-02-17 22:40:31 +000039 self.assertRaises(TypeError, posix_func, 1)
Neal Norwitze241ce82003-02-17 18:17:05 +000040
41 def test_statvfs(self):
42 if hasattr(posix, 'statvfs'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +000043 self.assert_(posix.statvfs(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +000044
45 def test_fstatvfs(self):
46 if hasattr(posix, 'fstatvfs'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000047 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000048 try:
Neal Norwitz2ff51a82003-02-17 22:40:31 +000049 self.assert_(posix.fstatvfs(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +000050 finally:
51 fp.close()
52
53 def test_ftruncate(self):
54 if hasattr(posix, 'ftruncate'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000055 fp = open(support.TESTFN, 'w+')
Neal Norwitze241ce82003-02-17 18:17:05 +000056 try:
57 # we need to have some data to truncate
58 fp.write('test')
59 fp.flush()
60 posix.ftruncate(fp.fileno(), 0)
61 finally:
62 fp.close()
63
64 def test_dup(self):
65 if hasattr(posix, 'dup'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000066 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000067 try:
68 fd = posix.dup(fp.fileno())
Neal Norwitz2ff51a82003-02-17 22:40:31 +000069 self.assert_(isinstance(fd, int))
Neal Norwitze241ce82003-02-17 18:17:05 +000070 os.close(fd)
71 finally:
72 fp.close()
73
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000074 def test_confstr(self):
75 if hasattr(posix, 'confstr'):
76 self.assertRaises(ValueError, posix.confstr, "CS_garbage")
77 self.assertEqual(len(posix.confstr("CS_PATH")) > 0, True)
78
Neal Norwitze241ce82003-02-17 18:17:05 +000079 def test_dup2(self):
80 if hasattr(posix, 'dup2'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000081 fp1 = open(support.TESTFN)
82 fp2 = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +000083 try:
84 posix.dup2(fp1.fileno(), fp2.fileno())
85 finally:
86 fp1.close()
87 fp2.close()
88
Skip Montanaro98470002005-06-17 01:14:49 +000089 def test_osexlock(self):
90 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000092 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000093 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000094 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
95 os.close(fd)
96
97 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000098 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000099 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000100 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000101 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
102 os.close(fd)
103
104 def test_osshlock(self):
105 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000106 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000107 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000108 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000109 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
110 os.close(fd2)
111 os.close(fd1)
112
113 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000114 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000115 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000116 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000117 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
118 os.close(fd)
119
Neal Norwitze241ce82003-02-17 18:17:05 +0000120 def test_fstat(self):
121 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000122 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000123 try:
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000124 self.assert_(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000125 finally:
126 fp.close()
127
128 def test_stat(self):
129 if hasattr(posix, 'stat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000130 self.assert_(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000131
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000132 if hasattr(posix, 'chown'):
133 def test_chown(self):
134 # raise an OSError if the file does not exist
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000135 os.unlink(support.TESTFN)
136 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000137
138 # re-create the file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000139 open(support.TESTFN, 'w').close()
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000140 if os.getuid() == 0:
141 try:
142 # Many linux distros have a nfsnobody user as MAX_UID-2
143 # that makes a good test case for signedness issues.
144 # http://bugs.python.org/issue1747858
145 # This part of the test only runs when run as root.
146 # Only scary people run their tests as root.
147 ent = pwd.getpwnam('nfsnobody')
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000148 posix.chown(support.TESTFN, ent.pw_uid, ent.pw_gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000149 except KeyError:
150 pass
151 else:
152 # non-root cannot chown to root, raises OSError
153 self.assertRaises(OSError, posix.chown,
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000154 support.TESTFN, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000155
156 # test a successful chown call
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000157 posix.chown(support.TESTFN, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000158
Neal Norwitze241ce82003-02-17 18:17:05 +0000159 def test_chdir(self):
160 if hasattr(posix, 'chdir'):
161 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000162 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000163
164 def test_lsdir(self):
165 if hasattr(posix, 'lsdir'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000166 self.assert_(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000167
168 def test_access(self):
169 if hasattr(posix, 'access'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000170 self.assert_(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000171
172 def test_umask(self):
173 if hasattr(posix, 'umask'):
174 old_mask = posix.umask(0)
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000175 self.assert_(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000176 posix.umask(old_mask)
177
178 def test_strerror(self):
179 if hasattr(posix, 'strerror'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000180 self.assert_(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000181
182 def test_pipe(self):
183 if hasattr(posix, 'pipe'):
184 reader, writer = posix.pipe()
185 os.close(reader)
186 os.close(writer)
187
Neal Norwitze241ce82003-02-17 18:17:05 +0000188 def test_utime(self):
189 if hasattr(posix, 'utime'):
190 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000191 posix.utime(support.TESTFN, None)
192 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
193 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
194 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
195 posix.utime(support.TESTFN, (int(now), int(now)))
196 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000197
Thomas Wouterscf297e42007-02-23 15:07:44 +0000198 def test_chflags(self):
199 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000200 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000201 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000202 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000203
204 def test_lchflags(self):
205 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000206 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000207 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000208 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000209
Guido van Rossum98297ee2007-11-06 21:34:58 +0000210 def test_environ(self):
211 for k, v in posix.environ.items():
212 self.assertEqual(type(k), str)
213 self.assertEqual(type(v), str)
214
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000215 def test_getcwd_long_pathnames(self):
216 if hasattr(posix, 'getcwd'):
217 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
218 curdir = os.getcwd()
219 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
220
221 try:
222 os.mkdir(base_path)
223 os.chdir(base_path)
224 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000225# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000226# because the test results in Error in that case.
227# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000228# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000229 return
230
231 def _create_and_do_getcwd(dirname, current_path_length = 0):
232 try:
233 os.mkdir(dirname)
234 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000235 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000236
237 os.chdir(dirname)
238 try:
239 os.getcwd()
240 if current_path_length < 1027:
241 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
242 finally:
243 os.chdir('..')
244 os.rmdir(dirname)
245
246 _create_and_do_getcwd(dirname)
247
248 finally:
Neal Norwitzc34177c2008-08-25 01:04:16 +0000249 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000250 os.chdir(curdir)
251
252
Neal Norwitze241ce82003-02-17 18:17:05 +0000253def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000254 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000255
256if __name__ == '__main__':
257 test_main()