blob: f16abb2f6ebbf1924e87aac967d5bcd881bb6b84 [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
Neal Norwitze241ce82003-02-17 18:17:05 +000013import unittest
14import warnings
15warnings.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):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000026 os.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)
31 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdu", "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'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +000045 self.assert_(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:
Neal Norwitz2ff51a82003-02-17 22:40:31 +000051 self.assert_(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())
Neal Norwitz2ff51a82003-02-17 22:40:31 +000071 self.assert_(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
91 def fdopen_helper(self, *args):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000092 fd = os.open(support.TESTFN, os.O_RDONLY)
Neal Norwitze241ce82003-02-17 18:17:05 +000093 fp2 = posix.fdopen(fd, *args)
94 fp2.close()
95
96 def test_fdopen(self):
97 if hasattr(posix, 'fdopen'):
98 self.fdopen_helper()
99 self.fdopen_helper('r')
100 self.fdopen_helper('r', 100)
101
Skip Montanaro98470002005-06-17 01:14:49 +0000102 def test_osexlock(self):
103 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000104 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000105 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000106 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000107 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
108 os.close(fd)
109
110 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000111 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000112 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000113 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000114 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
115 os.close(fd)
116
117 def test_osshlock(self):
118 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000119 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000120 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000121 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000122 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
123 os.close(fd2)
124 os.close(fd1)
125
126 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000127 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000128 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000129 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000130 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
131 os.close(fd)
132
Neal Norwitze241ce82003-02-17 18:17:05 +0000133 def test_fstat(self):
134 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000135 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000136 try:
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000137 self.assert_(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000138 finally:
139 fp.close()
140
141 def test_stat(self):
142 if hasattr(posix, 'stat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000143 self.assert_(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000144
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000145 if hasattr(posix, 'chown'):
146 def test_chown(self):
147 # raise an OSError if the file does not exist
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000148 os.unlink(support.TESTFN)
149 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000150
151 # re-create the file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000152 open(support.TESTFN, 'w').close()
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000153 if os.getuid() == 0:
154 try:
155 # Many linux distros have a nfsnobody user as MAX_UID-2
156 # that makes a good test case for signedness issues.
157 # http://bugs.python.org/issue1747858
158 # This part of the test only runs when run as root.
159 # Only scary people run their tests as root.
160 ent = pwd.getpwnam('nfsnobody')
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000161 posix.chown(support.TESTFN, ent.pw_uid, ent.pw_gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000162 except KeyError:
163 pass
164 else:
165 # non-root cannot chown to root, raises OSError
166 self.assertRaises(OSError, posix.chown,
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000167 support.TESTFN, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000168
169 # test a successful chown call
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000170 posix.chown(support.TESTFN, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000171
Neal Norwitze241ce82003-02-17 18:17:05 +0000172 def test_chdir(self):
173 if hasattr(posix, 'chdir'):
174 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000175 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000176
177 def test_lsdir(self):
178 if hasattr(posix, 'lsdir'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000179 self.assert_(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000180
181 def test_access(self):
182 if hasattr(posix, 'access'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000183 self.assert_(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000184
185 def test_umask(self):
186 if hasattr(posix, 'umask'):
187 old_mask = posix.umask(0)
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000188 self.assert_(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000189 posix.umask(old_mask)
190
191 def test_strerror(self):
192 if hasattr(posix, 'strerror'):
Neal Norwitz2ff51a82003-02-17 22:40:31 +0000193 self.assert_(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000194
195 def test_pipe(self):
196 if hasattr(posix, 'pipe'):
197 reader, writer = posix.pipe()
198 os.close(reader)
199 os.close(writer)
200
Neal Norwitze241ce82003-02-17 18:17:05 +0000201 def test_utime(self):
202 if hasattr(posix, 'utime'):
203 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000204 posix.utime(support.TESTFN, None)
205 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
206 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
207 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
208 posix.utime(support.TESTFN, (int(now), int(now)))
209 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000210
Thomas Wouterscf297e42007-02-23 15:07:44 +0000211 def test_chflags(self):
212 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000213 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000214 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000215 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000216
217 def test_lchflags(self):
218 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000219 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000220 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000221 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000222
Guido van Rossum98297ee2007-11-06 21:34:58 +0000223 def test_environ(self):
224 for k, v in posix.environ.items():
225 self.assertEqual(type(k), str)
226 self.assertEqual(type(v), str)
227
Neal Norwitze241ce82003-02-17 18:17:05 +0000228def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000229 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000230
231if __name__ == '__main__':
232 test_main()