blob: 2047e527e48a81df2d1dd473e922e29f00806625 [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
R. David Murrayeb3615d2009-04-22 02:24:39 +00004
5# Skip these tests if there is no posix module.
6posix = support.import_module('posix')
Neal Norwitze241ce82003-02-17 18:17:05 +00007
Neal Norwitze241ce82003-02-17 18:17:05 +00008import time
9import os
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000010import pwd
Benjamin Petersondcf97b92008-07-02 17:30:14 +000011import shutil
Neal Norwitze241ce82003-02-17 18:17:05 +000012import unittest
13import warnings
R. David Murraya21e4ca2009-03-31 23:16:50 +000014
Neal Norwitze241ce82003-02-17 18:17:05 +000015warnings.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):
Neal Norwitzc34177c2008-08-25 01:04:16 +000026 support.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)
Guido van Rossumf0af3e32008-10-02 18:55:37 +000031 NO_ARG_FUNCTIONS = [ "ctermid", "getcwd", "getcwdb", "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'):
Georg Brandlab91fde2009-08-13 08:51:18 +000045 self.assertTrue(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:
Georg Brandlab91fde2009-08-13 08:51:18 +000051 self.assertTrue(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())
Georg Brandlab91fde2009-08-13 08:51:18 +000071 self.assertTrue(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
Skip Montanaro98470002005-06-17 01:14:49 +000091 def test_osexlock(self):
92 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000093 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000094 os.O_WRONLY|os.O_EXLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000095 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +000096 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
97 os.close(fd)
98
99 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000100 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000101 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000102 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000103 os.O_WRONLY|os.O_EXLOCK|os.O_NONBLOCK)
104 os.close(fd)
105
106 def test_osshlock(self):
107 if hasattr(posix, "O_SHLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000108 fd1 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000109 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000110 fd2 = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000111 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
112 os.close(fd2)
113 os.close(fd1)
114
115 if hasattr(posix, "O_EXLOCK"):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000116 fd = os.open(support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000117 os.O_WRONLY|os.O_SHLOCK|os.O_CREAT)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000118 self.assertRaises(OSError, os.open, support.TESTFN,
Skip Montanaro98470002005-06-17 01:14:49 +0000119 os.O_RDONLY|os.O_EXLOCK|os.O_NONBLOCK)
120 os.close(fd)
121
Neal Norwitze241ce82003-02-17 18:17:05 +0000122 def test_fstat(self):
123 if hasattr(posix, 'fstat'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000124 fp = open(support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000125 try:
Georg Brandlab91fde2009-08-13 08:51:18 +0000126 self.assertTrue(posix.fstat(fp.fileno()))
Neal Norwitze241ce82003-02-17 18:17:05 +0000127 finally:
128 fp.close()
129
130 def test_stat(self):
131 if hasattr(posix, 'stat'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000132 self.assertTrue(posix.stat(support.TESTFN))
Neal Norwitze241ce82003-02-17 18:17:05 +0000133
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000134 if hasattr(posix, 'chown'):
135 def test_chown(self):
136 # raise an OSError if the file does not exist
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000137 os.unlink(support.TESTFN)
138 self.assertRaises(OSError, posix.chown, support.TESTFN, -1, -1)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000139
140 # re-create the file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000141 open(support.TESTFN, 'w').close()
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000142 if os.getuid() == 0:
143 try:
144 # Many linux distros have a nfsnobody user as MAX_UID-2
145 # that makes a good test case for signedness issues.
146 # http://bugs.python.org/issue1747858
147 # This part of the test only runs when run as root.
148 # Only scary people run their tests as root.
149 ent = pwd.getpwnam('nfsnobody')
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000150 posix.chown(support.TESTFN, ent.pw_uid, ent.pw_gid)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000151 except KeyError:
152 pass
153 else:
154 # non-root cannot chown to root, raises OSError
155 self.assertRaises(OSError, posix.chown,
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000156 support.TESTFN, 0, 0)
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000157
158 # test a successful chown call
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000159 posix.chown(support.TESTFN, os.getuid(), os.getgid())
Christian Heimesd5e2b6f2008-03-19 21:50:51 +0000160
Neal Norwitze241ce82003-02-17 18:17:05 +0000161 def test_chdir(self):
162 if hasattr(posix, 'chdir'):
163 posix.chdir(os.curdir)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000164 self.assertRaises(OSError, posix.chdir, support.TESTFN)
Neal Norwitze241ce82003-02-17 18:17:05 +0000165
166 def test_lsdir(self):
167 if hasattr(posix, 'lsdir'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000168 self.assertTrue(support.TESTFN in posix.lsdir(os.curdir))
Neal Norwitze241ce82003-02-17 18:17:05 +0000169
170 def test_access(self):
171 if hasattr(posix, 'access'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000172 self.assertTrue(posix.access(support.TESTFN, os.R_OK))
Neal Norwitze241ce82003-02-17 18:17:05 +0000173
174 def test_umask(self):
175 if hasattr(posix, 'umask'):
176 old_mask = posix.umask(0)
Georg Brandlab91fde2009-08-13 08:51:18 +0000177 self.assertTrue(isinstance(old_mask, int))
Neal Norwitze241ce82003-02-17 18:17:05 +0000178 posix.umask(old_mask)
179
180 def test_strerror(self):
181 if hasattr(posix, 'strerror'):
Georg Brandlab91fde2009-08-13 08:51:18 +0000182 self.assertTrue(posix.strerror(0))
Neal Norwitze241ce82003-02-17 18:17:05 +0000183
184 def test_pipe(self):
185 if hasattr(posix, 'pipe'):
186 reader, writer = posix.pipe()
187 os.close(reader)
188 os.close(writer)
189
Neal Norwitze241ce82003-02-17 18:17:05 +0000190 def test_utime(self):
191 if hasattr(posix, 'utime'):
192 now = time.time()
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000193 posix.utime(support.TESTFN, None)
194 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, None))
195 self.assertRaises(TypeError, posix.utime, support.TESTFN, (now, None))
196 self.assertRaises(TypeError, posix.utime, support.TESTFN, (None, now))
197 posix.utime(support.TESTFN, (int(now), int(now)))
198 posix.utime(support.TESTFN, (now, now))
Neal Norwitze241ce82003-02-17 18:17:05 +0000199
Thomas Wouterscf297e42007-02-23 15:07:44 +0000200 def test_chflags(self):
201 if hasattr(posix, 'chflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000202 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000203 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000204 posix.chflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000205
206 def test_lchflags(self):
207 if hasattr(posix, 'lchflags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000208 st = os.stat(support.TESTFN)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000209 if hasattr(st, 'st_flags'):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000210 posix.lchflags(support.TESTFN, st.st_flags)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000211
Guido van Rossum98297ee2007-11-06 21:34:58 +0000212 def test_environ(self):
213 for k, v in posix.environ.items():
214 self.assertEqual(type(k), str)
215 self.assertEqual(type(v), str)
216
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000217 def test_getcwd_long_pathnames(self):
218 if hasattr(posix, 'getcwd'):
219 dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
220 curdir = os.getcwd()
221 base_path = os.path.abspath(support.TESTFN) + '.getcwd'
222
223 try:
224 os.mkdir(base_path)
225 os.chdir(base_path)
226 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000227# Just returning nothing instead of the SkipTest exception,
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000228# because the test results in Error in that case.
229# Is that ok?
Benjamin Petersone549ead2009-03-28 21:42:05 +0000230# raise unittest.SkipTest("cannot create directory for testing")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000231 return
232
233 def _create_and_do_getcwd(dirname, current_path_length = 0):
234 try:
235 os.mkdir(dirname)
236 except:
Benjamin Petersone549ead2009-03-28 21:42:05 +0000237 raise unittest.SkipTest("mkdir cannot create directory sufficiently deep for getcwd test")
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000238
239 os.chdir(dirname)
240 try:
241 os.getcwd()
242 if current_path_length < 1027:
243 _create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
244 finally:
245 os.chdir('..')
246 os.rmdir(dirname)
247
248 _create_and_do_getcwd(dirname)
249
250 finally:
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000251 os.chdir(curdir)
R. David Murray28a60012009-07-09 20:31:08 +0000252 support.rmtree(base_path)
Benjamin Petersondcf97b92008-07-02 17:30:14 +0000253
254
Neal Norwitze241ce82003-02-17 18:17:05 +0000255def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000256 support.run_unittest(PosixTester)
Neal Norwitze241ce82003-02-17 18:17:05 +0000257
258if __name__ == '__main__':
259 test_main()