blob: 9cfd7b8ffb9d3a47e0ab6301f69c477899bc32ff [file] [log] [blame]
Fred Drake38c2ef02001-07-17 20:52:51 +00001# As a test suite for the os module, this is woefully inadequate, but this
2# does add tests for a few functions which have been determined to be more
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +00003# portable than they had been thought to be.
Fred Drake38c2ef02001-07-17 20:52:51 +00004
5import os
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00006import errno
Fred Drake38c2ef02001-07-17 20:52:51 +00007import unittest
Jeremy Hyltona7fc21b2001-08-20 20:10:01 +00008import warnings
Thomas Wouters477c8d52006-05-27 19:21:47 +00009import sys
Brian Curtineb24d742010-04-12 17:16:38 +000010import signal
11import subprocess
12import time
Martin v. Löwis011e8422009-05-05 04:43:17 +000013import shutil
Benjamin Petersonee8712c2008-05-20 21:35:26 +000014from test import support
Victor Stinnerc2d095f2010-05-17 00:14:53 +000015import contextlib
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +000016import mmap
17import uuid
Fred Drake38c2ef02001-07-17 20:52:51 +000018
Mark Dickinson7cf03892010-04-16 13:45:35 +000019# Detect whether we're on a Linux system that uses the (now outdated
20# and unmaintained) linuxthreads threading library. There's an issue
21# when combining linuxthreads with a failed execv call: see
22# http://bugs.python.org/issue4970.
Mark Dickinson89589c92010-04-16 13:51:27 +000023if (hasattr(os, "confstr_names") and
24 "CS_GNU_LIBPTHREAD_VERSION" in os.confstr_names):
Mark Dickinson7cf03892010-04-16 13:45:35 +000025 libpthread = os.confstr("CS_GNU_LIBPTHREAD_VERSION")
26 USING_LINUXTHREADS= libpthread.startswith("linuxthreads")
27else:
28 USING_LINUXTHREADS= False
Brian Curtineb24d742010-04-12 17:16:38 +000029
Thomas Wouters0e3f5912006-08-11 14:57:12 +000030# Tests creating TESTFN
31class FileTests(unittest.TestCase):
32 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033 if os.path.exists(support.TESTFN):
34 os.unlink(support.TESTFN)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000035 tearDown = setUp
36
37 def test_access(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000038 f = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000039 os.close(f)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000040 self.assertTrue(os.access(support.TESTFN, os.W_OK))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000041
Christian Heimesfdab48e2008-01-20 09:06:41 +000042 def test_closerange(self):
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000043 first = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR)
44 # We must allocate two consecutive file descriptors, otherwise
45 # it will mess up other file descriptors (perhaps even the three
46 # standard ones).
47 second = os.dup(first)
48 try:
49 retries = 0
50 while second != first + 1:
51 os.close(first)
52 retries += 1
53 if retries > 10:
54 # XXX test skipped
Benjamin Petersonfa0d7032009-06-01 22:42:33 +000055 self.skipTest("couldn't allocate two consecutive fds")
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000056 first, second = second, os.dup(second)
57 finally:
58 os.close(second)
Christian Heimesfdab48e2008-01-20 09:06:41 +000059 # close a fd that is open, and one that isn't
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000060 os.closerange(first, first + 2)
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000061 self.assertRaises(OSError, os.write, first, b"a")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000062
Benjamin Peterson1cc6df92010-06-30 17:39:45 +000063 @support.cpython_only
Hirokazu Yamamoto4c19e6e2008-09-08 23:41:21 +000064 def test_rename(self):
65 path = support.TESTFN
66 old = sys.getrefcount(path)
67 self.assertRaises(TypeError, os.rename, path, 0)
68 new = sys.getrefcount(path)
69 self.assertEqual(old, new)
70
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000071 def test_read(self):
72 with open(support.TESTFN, "w+b") as fobj:
73 fobj.write(b"spam")
74 fobj.flush()
75 fd = fobj.fileno()
76 os.lseek(fd, 0, 0)
77 s = os.read(fd, 4)
78 self.assertEqual(type(s), bytes)
79 self.assertEqual(s, b"spam")
80
81 def test_write(self):
82 # os.write() accepts bytes- and buffer-like objects but not strings
83 fd = os.open(support.TESTFN, os.O_CREAT | os.O_WRONLY)
84 self.assertRaises(TypeError, os.write, fd, "beans")
85 os.write(fd, b"bacon\n")
86 os.write(fd, bytearray(b"eggs\n"))
87 os.write(fd, memoryview(b"spam\n"))
88 os.close(fd)
89 with open(support.TESTFN, "rb") as fobj:
Antoine Pitroud62269f2008-09-15 23:54:52 +000090 self.assertEqual(fobj.read().splitlines(),
91 [b"bacon", b"eggs", b"spam"])
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000092
93
Christian Heimesdd15f6c2008-03-16 00:07:10 +000094class TemporaryFileTests(unittest.TestCase):
95 def setUp(self):
96 self.files = []
Benjamin Petersonee8712c2008-05-20 21:35:26 +000097 os.mkdir(support.TESTFN)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000098
99 def tearDown(self):
100 for name in self.files:
101 os.unlink(name)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000102 os.rmdir(support.TESTFN)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000103
104 def check_tempfile(self, name):
105 # make sure it doesn't already exist:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000106 self.assertFalse(os.path.exists(name),
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000107 "file already exists for temporary file")
108 # make sure we can create the file
109 open(name, "w")
110 self.files.append(name)
111
112 def test_tempnam(self):
113 if not hasattr(os, "tempnam"):
114 return
115 warnings.filterwarnings("ignore", "tempnam", RuntimeWarning,
116 r"test_os$")
117 self.check_tempfile(os.tempnam())
118
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000119 name = os.tempnam(support.TESTFN)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000120 self.check_tempfile(name)
121
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000122 name = os.tempnam(support.TESTFN, "pfx")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000123 self.assertTrue(os.path.basename(name)[:3] == "pfx")
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000124 self.check_tempfile(name)
125
126 def test_tmpfile(self):
127 if not hasattr(os, "tmpfile"):
128 return
129 # As with test_tmpnam() below, the Windows implementation of tmpfile()
130 # attempts to create a file in the root directory of the current drive.
131 # On Vista and Server 2008, this test will always fail for normal users
132 # as writing to the root directory requires elevated privileges. With
133 # XP and below, the semantics of tmpfile() are the same, but the user
134 # running the test is more likely to have administrative privileges on
135 # their account already. If that's the case, then os.tmpfile() should
136 # work. In order to make this test as useful as possible, rather than
137 # trying to detect Windows versions or whether or not the user has the
138 # right permissions, just try and create a file in the root directory
139 # and see if it raises a 'Permission denied' OSError. If it does, then
140 # test that a subsequent call to os.tmpfile() raises the same error. If
141 # it doesn't, assume we're on XP or below and the user running the test
142 # has administrative privileges, and proceed with the test as normal.
143 if sys.platform == 'win32':
144 name = '\\python_test_os_test_tmpfile.txt'
145 if os.path.exists(name):
146 os.remove(name)
147 try:
148 fp = open(name, 'w')
149 except IOError as first:
150 # open() failed, assert tmpfile() fails in the same way.
151 # Although open() raises an IOError and os.tmpfile() raises an
152 # OSError(), 'args' will be (13, 'Permission denied') in both
153 # cases.
154 try:
155 fp = os.tmpfile()
156 except OSError as second:
157 self.assertEqual(first.args, second.args)
158 else:
159 self.fail("expected os.tmpfile() to raise OSError")
160 return
161 else:
162 # open() worked, therefore, tmpfile() should work. Close our
163 # dummy file and proceed with the test as normal.
164 fp.close()
165 os.remove(name)
166
167 fp = os.tmpfile()
168 fp.write("foobar")
169 fp.seek(0,0)
170 s = fp.read()
171 fp.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000172 self.assertTrue(s == "foobar")
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000173
174 def test_tmpnam(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000175 if not hasattr(os, "tmpnam"):
176 return
177 warnings.filterwarnings("ignore", "tmpnam", RuntimeWarning,
178 r"test_os$")
179 name = os.tmpnam()
180 if sys.platform in ("win32",):
181 # The Windows tmpnam() seems useless. From the MS docs:
182 #
183 # The character string that tmpnam creates consists of
184 # the path prefix, defined by the entry P_tmpdir in the
185 # file STDIO.H, followed by a sequence consisting of the
186 # digit characters '0' through '9'; the numerical value
187 # of this string is in the range 1 - 65,535. Changing the
188 # definitions of L_tmpnam or P_tmpdir in STDIO.H does not
189 # change the operation of tmpnam.
190 #
191 # The really bizarre part is that, at least under MSVC6,
192 # P_tmpdir is "\\". That is, the path returned refers to
193 # the root of the current drive. That's a terrible place to
194 # put temp files, and, depending on privileges, the user
195 # may not even be able to open a file in the root directory.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000196 self.assertFalse(os.path.exists(name),
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000197 "file already exists for temporary file")
198 else:
199 self.check_tempfile(name)
200
Amaury Forgeot d'Arce2e36ba2008-08-01 00:14:22 +0000201 def fdopen_helper(self, *args):
202 fd = os.open(support.TESTFN, os.O_RDONLY)
203 fp2 = os.fdopen(fd, *args)
204 fp2.close()
205
206 def test_fdopen(self):
207 self.fdopen_helper()
208 self.fdopen_helper('r')
209 self.fdopen_helper('r', 100)
210
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000211# Test attributes on return values from os.*stat* family.
212class StatAttributeTests(unittest.TestCase):
213 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000214 os.mkdir(support.TESTFN)
215 self.fname = os.path.join(support.TESTFN, "f1")
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000216 f = open(self.fname, 'wb')
Guido van Rossum26d95c32007-08-27 23:18:54 +0000217 f.write(b"ABC")
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000218 f.close()
Tim Peterse0c446b2001-10-18 21:57:37 +0000219
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000220 def tearDown(self):
221 os.unlink(self.fname)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000222 os.rmdir(support.TESTFN)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000223
Antoine Pitrou38425292010-09-21 18:19:07 +0000224 def check_stat_attributes(self, fname):
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000225 if not hasattr(os, "stat"):
226 return
227
228 import stat
Antoine Pitrou38425292010-09-21 18:19:07 +0000229 result = os.stat(fname)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000230
231 # Make sure direct access works
Ezio Melottib3aedd42010-11-20 19:04:17 +0000232 self.assertEqual(result[stat.ST_SIZE], 3)
233 self.assertEqual(result.st_size, 3)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000234
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000235 # Make sure all the attributes are there
236 members = dir(result)
237 for name in dir(stat):
238 if name[:3] == 'ST_':
239 attr = name.lower()
Martin v. Löwis4d394df2005-01-23 09:19:22 +0000240 if name.endswith("TIME"):
241 def trunc(x): return int(x)
242 else:
243 def trunc(x): return x
Ezio Melottib3aedd42010-11-20 19:04:17 +0000244 self.assertEqual(trunc(getattr(result, attr)),
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000245 result[getattr(stat, name)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000246 self.assertIn(attr, members)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000247
248 try:
249 result[200]
250 self.fail("No exception thrown")
251 except IndexError:
252 pass
253
254 # Make sure that assignment fails
255 try:
256 result.st_mode = 1
257 self.fail("No exception thrown")
Collin Winter42dae6a2007-03-28 21:44:53 +0000258 except AttributeError:
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000259 pass
260
261 try:
262 result.st_rdev = 1
263 self.fail("No exception thrown")
Guido van Rossum1fff8782001-10-18 21:19:31 +0000264 except (AttributeError, TypeError):
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000265 pass
266
267 try:
268 result.parrot = 1
269 self.fail("No exception thrown")
270 except AttributeError:
271 pass
272
273 # Use the stat_result constructor with a too-short tuple.
274 try:
275 result2 = os.stat_result((10,))
276 self.fail("No exception thrown")
277 except TypeError:
278 pass
279
280 # Use the constructr with a too-long tuple.
281 try:
282 result2 = os.stat_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14))
283 except TypeError:
284 pass
285
Antoine Pitrou38425292010-09-21 18:19:07 +0000286 def test_stat_attributes(self):
287 self.check_stat_attributes(self.fname)
288
289 def test_stat_attributes_bytes(self):
290 try:
291 fname = self.fname.encode(sys.getfilesystemencoding())
292 except UnicodeEncodeError:
293 self.skipTest("cannot encode %a for the filesystem" % self.fname)
294 self.check_stat_attributes(fname)
Tim Peterse0c446b2001-10-18 21:57:37 +0000295
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000296 def test_statvfs_attributes(self):
297 if not hasattr(os, "statvfs"):
298 return
299
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000300 try:
301 result = os.statvfs(self.fname)
Guido van Rossumb940e112007-01-10 16:19:56 +0000302 except OSError as e:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000303 # On AtheOS, glibc always returns ENOSYS
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000304 if e.errno == errno.ENOSYS:
305 return
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000306
307 # Make sure direct access works
Ezio Melottib3aedd42010-11-20 19:04:17 +0000308 self.assertEqual(result.f_bfree, result[3])
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000309
Brett Cannoncfaf10c2008-05-16 00:45:35 +0000310 # Make sure all the attributes are there.
311 members = ('bsize', 'frsize', 'blocks', 'bfree', 'bavail', 'files',
312 'ffree', 'favail', 'flag', 'namemax')
313 for value, member in enumerate(members):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000314 self.assertEqual(getattr(result, 'f_' + member), result[value])
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000315
316 # Make sure that assignment really fails
317 try:
318 result.f_bfree = 1
319 self.fail("No exception thrown")
Collin Winter42dae6a2007-03-28 21:44:53 +0000320 except AttributeError:
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000321 pass
322
323 try:
324 result.parrot = 1
325 self.fail("No exception thrown")
326 except AttributeError:
327 pass
328
329 # Use the constructor with a too-short tuple.
330 try:
331 result2 = os.statvfs_result((10,))
332 self.fail("No exception thrown")
333 except TypeError:
334 pass
335
336 # Use the constructr with a too-long tuple.
337 try:
338 result2 = os.statvfs_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14))
339 except TypeError:
340 pass
Fred Drake38c2ef02001-07-17 20:52:51 +0000341
Thomas Wouters89f507f2006-12-13 04:49:30 +0000342 def test_utime_dir(self):
343 delta = 1000000
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000344 st = os.stat(support.TESTFN)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000345 # round to int, because some systems may support sub-second
346 # time stamps in stat, but not in utime.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000347 os.utime(support.TESTFN, (st.st_atime, int(st.st_mtime-delta)))
348 st2 = os.stat(support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000349 self.assertEqual(st2.st_mtime, int(st.st_mtime-delta))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000350
351 # Restrict test to Win32, since there is no guarantee other
352 # systems support centiseconds
353 if sys.platform == 'win32':
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000354 def get_file_system(path):
Hirokazu Yamamoto5ef6d182008-08-20 04:17:24 +0000355 root = os.path.splitdrive(os.path.abspath(path))[0] + '\\'
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000356 import ctypes
Hirokazu Yamamotoca765d52008-08-20 16:18:19 +0000357 kernel32 = ctypes.windll.kernel32
Hirokazu Yamamoto5ef6d182008-08-20 04:17:24 +0000358 buf = ctypes.create_unicode_buffer("", 100)
Hirokazu Yamamotoca765d52008-08-20 16:18:19 +0000359 if kernel32.GetVolumeInformationW(root, None, 0, None, None, None, buf, len(buf)):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000360 return buf.value
361
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000362 if get_file_system(support.TESTFN) == "NTFS":
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000363 def test_1565150(self):
364 t1 = 1159195039.25
365 os.utime(self.fname, (t1, t1))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000366 self.assertEqual(os.stat(self.fname).st_mtime, t1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000367
Guido van Rossumd8faa362007-04-27 19:54:29 +0000368 def test_1686475(self):
369 # Verify that an open file can be stat'ed
370 try:
371 os.stat(r"c:\pagefile.sys")
372 except WindowsError as e:
Benjamin Petersonc4fe6f32008-08-19 18:57:56 +0000373 if e.errno == 2: # file does not exist; cannot run test
Guido van Rossumd8faa362007-04-27 19:54:29 +0000374 return
375 self.fail("Could not stat pagefile.sys")
376
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000377from test import mapping_tests
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000378
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000379class EnvironTests(mapping_tests.BasicTestMappingProtocol):
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000380 """check that os.environ object conform to mapping protocol"""
Walter Dörwald118f9312004-06-02 18:42:25 +0000381 type2test = None
Christian Heimes90333392007-11-01 19:08:42 +0000382
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000383 def setUp(self):
384 self.__save = dict(os.environ)
Victor Stinnerb745a742010-05-18 17:17:23 +0000385 if os.supports_bytes_environ:
Victor Stinner208d28c2010-05-07 00:54:14 +0000386 self.__saveb = dict(os.environb)
Christian Heimes90333392007-11-01 19:08:42 +0000387 for key, value in self._reference().items():
388 os.environ[key] = value
389
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000390 def tearDown(self):
391 os.environ.clear()
392 os.environ.update(self.__save)
Victor Stinnerb745a742010-05-18 17:17:23 +0000393 if os.supports_bytes_environ:
Victor Stinner208d28c2010-05-07 00:54:14 +0000394 os.environb.clear()
395 os.environb.update(self.__saveb)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000396
Christian Heimes90333392007-11-01 19:08:42 +0000397 def _reference(self):
398 return {"KEY1":"VALUE1", "KEY2":"VALUE2", "KEY3":"VALUE3"}
399
400 def _empty_mapping(self):
401 os.environ.clear()
402 return os.environ
403
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000404 # Bug 1110478
Martin v. Löwis5510f652005-02-17 21:23:20 +0000405 def test_update2(self):
Christian Heimes90333392007-11-01 19:08:42 +0000406 os.environ.clear()
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000407 if os.path.exists("/bin/sh"):
408 os.environ.update(HELLO="World")
Brian Curtin810921b2010-10-30 21:24:21 +0000409 with os.popen("/bin/sh -c 'echo $HELLO'") as popen:
410 value = popen.read().strip()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000411 self.assertEqual(value, "World")
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000412
Christian Heimes1a13d592007-11-08 14:16:55 +0000413 def test_os_popen_iter(self):
414 if os.path.exists("/bin/sh"):
Brian Curtin810921b2010-10-30 21:24:21 +0000415 with os.popen(
416 "/bin/sh -c 'echo \"line1\nline2\nline3\"'") as popen:
417 it = iter(popen)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000418 self.assertEqual(next(it), "line1\n")
419 self.assertEqual(next(it), "line2\n")
420 self.assertEqual(next(it), "line3\n")
Brian Curtin810921b2010-10-30 21:24:21 +0000421 self.assertRaises(StopIteration, next, it)
Christian Heimes1a13d592007-11-08 14:16:55 +0000422
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000423 # Verify environ keys and values from the OS are of the
424 # correct str type.
425 def test_keyvalue_types(self):
426 for key, val in os.environ.items():
Ezio Melottib3aedd42010-11-20 19:04:17 +0000427 self.assertEqual(type(key), str)
428 self.assertEqual(type(val), str)
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000429
Christian Heimes90333392007-11-01 19:08:42 +0000430 def test_items(self):
431 for key, value in self._reference().items():
432 self.assertEqual(os.environ.get(key), value)
433
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000434 # Issue 7310
435 def test___repr__(self):
436 """Check that the repr() of os.environ looks like environ({...})."""
437 env = os.environ
Victor Stinner96f0de92010-07-29 00:29:00 +0000438 self.assertEqual(repr(env), 'environ({{{}}})'.format(', '.join(
439 '{!r}: {!r}'.format(key, value)
440 for key, value in env.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000441
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000442 def test_get_exec_path(self):
443 defpath_list = os.defpath.split(os.pathsep)
444 test_path = ['/monty', '/python', '', '/flying/circus']
445 test_env = {'PATH': os.pathsep.join(test_path)}
446
447 saved_environ = os.environ
448 try:
449 os.environ = dict(test_env)
450 # Test that defaulting to os.environ works.
451 self.assertSequenceEqual(test_path, os.get_exec_path())
452 self.assertSequenceEqual(test_path, os.get_exec_path(env=None))
453 finally:
454 os.environ = saved_environ
455
456 # No PATH environment variable
457 self.assertSequenceEqual(defpath_list, os.get_exec_path({}))
458 # Empty PATH environment variable
459 self.assertSequenceEqual(('',), os.get_exec_path({'PATH':''}))
460 # Supplied PATH environment variable
461 self.assertSequenceEqual(test_path, os.get_exec_path(test_env))
462
Victor Stinnerb745a742010-05-18 17:17:23 +0000463 if os.supports_bytes_environ:
464 # env cannot contain 'PATH' and b'PATH' keys
Victor Stinner38430e22010-08-19 17:10:18 +0000465 try:
Victor Stinner6f35eda2010-10-29 00:38:58 +0000466 # ignore BytesWarning warning
467 with warnings.catch_warnings(record=True):
468 mixed_env = {'PATH': '1', b'PATH': b'2'}
Victor Stinner38430e22010-08-19 17:10:18 +0000469 except BytesWarning:
Victor Stinner6f35eda2010-10-29 00:38:58 +0000470 # mixed_env cannot be created with python -bb
Victor Stinner38430e22010-08-19 17:10:18 +0000471 pass
472 else:
473 self.assertRaises(ValueError, os.get_exec_path, mixed_env)
Victor Stinnerb745a742010-05-18 17:17:23 +0000474
475 # bytes key and/or value
476 self.assertSequenceEqual(os.get_exec_path({b'PATH': b'abc'}),
477 ['abc'])
478 self.assertSequenceEqual(os.get_exec_path({b'PATH': 'abc'}),
479 ['abc'])
480 self.assertSequenceEqual(os.get_exec_path({'PATH': b'abc'}),
481 ['abc'])
482
483 @unittest.skipUnless(os.supports_bytes_environ,
484 "os.environb required for this test.")
Victor Stinner84ae1182010-05-06 22:05:07 +0000485 def test_environb(self):
486 # os.environ -> os.environb
487 value = 'euro\u20ac'
488 try:
Benjamin Peterson180799d2010-05-06 22:25:42 +0000489 value_bytes = value.encode(sys.getfilesystemencoding(),
490 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000491 except UnicodeEncodeError:
Benjamin Peterson180799d2010-05-06 22:25:42 +0000492 msg = "U+20AC character is not encodable to %s" % (
493 sys.getfilesystemencoding(),)
Benjamin Peterson932d3f42010-05-06 22:26:31 +0000494 self.skipTest(msg)
Victor Stinner84ae1182010-05-06 22:05:07 +0000495 os.environ['unicode'] = value
Ezio Melottib3aedd42010-11-20 19:04:17 +0000496 self.assertEqual(os.environ['unicode'], value)
497 self.assertEqual(os.environb[b'unicode'], value_bytes)
Victor Stinner84ae1182010-05-06 22:05:07 +0000498
499 # os.environb -> os.environ
500 value = b'\xff'
501 os.environb[b'bytes'] = value
Ezio Melottib3aedd42010-11-20 19:04:17 +0000502 self.assertEqual(os.environb[b'bytes'], value)
Victor Stinner84ae1182010-05-06 22:05:07 +0000503 value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000504 self.assertEqual(os.environ['bytes'], value_str)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000505
Tim Petersc4e09402003-04-25 07:11:48 +0000506class WalkTests(unittest.TestCase):
507 """Tests for os.walk()."""
508
509 def test_traversal(self):
510 import os
511 from os.path import join
512
513 # Build:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000514 # TESTFN/
515 # TEST1/ a file kid and two directory kids
Tim Petersc4e09402003-04-25 07:11:48 +0000516 # tmp1
517 # SUB1/ a file kid and a directory kid
Guido van Rossumd8faa362007-04-27 19:54:29 +0000518 # tmp2
519 # SUB11/ no kids
520 # SUB2/ a file kid and a dirsymlink kid
521 # tmp3
522 # link/ a symlink to TESTFN.2
523 # TEST2/
524 # tmp4 a lone file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000525 walk_path = join(support.TESTFN, "TEST1")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000526 sub1_path = join(walk_path, "SUB1")
Tim Petersc4e09402003-04-25 07:11:48 +0000527 sub11_path = join(sub1_path, "SUB11")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000528 sub2_path = join(walk_path, "SUB2")
529 tmp1_path = join(walk_path, "tmp1")
Tim Petersc4e09402003-04-25 07:11:48 +0000530 tmp2_path = join(sub1_path, "tmp2")
531 tmp3_path = join(sub2_path, "tmp3")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000532 link_path = join(sub2_path, "link")
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000533 t2_path = join(support.TESTFN, "TEST2")
534 tmp4_path = join(support.TESTFN, "TEST2", "tmp4")
Tim Petersc4e09402003-04-25 07:11:48 +0000535
536 # Create stuff.
537 os.makedirs(sub11_path)
538 os.makedirs(sub2_path)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000539 os.makedirs(t2_path)
540 for path in tmp1_path, tmp2_path, tmp3_path, tmp4_path:
Alex Martelli01c77c62006-08-24 02:58:11 +0000541 f = open(path, "w")
Tim Petersc4e09402003-04-25 07:11:48 +0000542 f.write("I'm " + path + " and proud of it. Blame test_os.\n")
543 f.close()
Brian Curtin52173d42010-12-02 18:29:18 +0000544 if hasattr(os, "symlink"):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000545 os.symlink(os.path.abspath(t2_path), link_path)
546 sub2_tree = (sub2_path, ["link"], ["tmp3"])
547 else:
548 sub2_tree = (sub2_path, [], ["tmp3"])
Tim Petersc4e09402003-04-25 07:11:48 +0000549
550 # Walk top-down.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000551 all = list(os.walk(walk_path))
Tim Petersc4e09402003-04-25 07:11:48 +0000552 self.assertEqual(len(all), 4)
553 # We can't know which order SUB1 and SUB2 will appear in.
554 # Not flipped: TESTFN, SUB1, SUB11, SUB2
555 # flipped: TESTFN, SUB2, SUB1, SUB11
556 flipped = all[0][1][0] != "SUB1"
557 all[0][1].sort()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000558 self.assertEqual(all[0], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
Tim Petersc4e09402003-04-25 07:11:48 +0000559 self.assertEqual(all[1 + flipped], (sub1_path, ["SUB11"], ["tmp2"]))
560 self.assertEqual(all[2 + flipped], (sub11_path, [], []))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000561 self.assertEqual(all[3 - 2 * flipped], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000562
563 # Prune the search.
564 all = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000565 for root, dirs, files in os.walk(walk_path):
Tim Petersc4e09402003-04-25 07:11:48 +0000566 all.append((root, dirs, files))
567 # Don't descend into SUB1.
568 if 'SUB1' in dirs:
569 # Note that this also mutates the dirs we appended to all!
570 dirs.remove('SUB1')
571 self.assertEqual(len(all), 2)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000572 self.assertEqual(all[0], (walk_path, ["SUB2"], ["tmp1"]))
573 self.assertEqual(all[1], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000574
575 # Walk bottom-up.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000576 all = list(os.walk(walk_path, topdown=False))
Tim Petersc4e09402003-04-25 07:11:48 +0000577 self.assertEqual(len(all), 4)
578 # We can't know which order SUB1 and SUB2 will appear in.
579 # Not flipped: SUB11, SUB1, SUB2, TESTFN
580 # flipped: SUB2, SUB11, SUB1, TESTFN
581 flipped = all[3][1][0] != "SUB1"
582 all[3][1].sort()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000583 self.assertEqual(all[3], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
Tim Petersc4e09402003-04-25 07:11:48 +0000584 self.assertEqual(all[flipped], (sub11_path, [], []))
585 self.assertEqual(all[flipped + 1], (sub1_path, ["SUB11"], ["tmp2"]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000586 self.assertEqual(all[2 - 2 * flipped], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000587
Brian Curtin52173d42010-12-02 18:29:18 +0000588 if hasattr(os, "symlink"):
Guido van Rossumd8faa362007-04-27 19:54:29 +0000589 # Walk, following symlinks.
590 for root, dirs, files in os.walk(walk_path, followlinks=True):
591 if root == link_path:
592 self.assertEqual(dirs, [])
593 self.assertEqual(files, ["tmp4"])
594 break
595 else:
596 self.fail("Didn't follow symlink with followlinks=True")
597
598 def tearDown(self):
Tim Petersc4e09402003-04-25 07:11:48 +0000599 # Tear everything down. This is a decent use for bottom-up on
600 # Windows, which doesn't have a recursive delete command. The
601 # (not so) subtlety is that rmdir will fail unless the dir's
602 # kids are removed first, so bottom up is essential.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000603 for root, dirs, files in os.walk(support.TESTFN, topdown=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000604 for name in files:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000605 os.remove(os.path.join(root, name))
Tim Petersc4e09402003-04-25 07:11:48 +0000606 for name in dirs:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000607 dirname = os.path.join(root, name)
608 if not os.path.islink(dirname):
609 os.rmdir(dirname)
610 else:
611 os.remove(dirname)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000612 os.rmdir(support.TESTFN)
Tim Petersc4e09402003-04-25 07:11:48 +0000613
Guido van Rossume7ba4952007-06-06 23:52:48 +0000614class MakedirTests(unittest.TestCase):
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000615 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000616 os.mkdir(support.TESTFN)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000617
618 def test_makedir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000619 base = support.TESTFN
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000620 path = os.path.join(base, 'dir1', 'dir2', 'dir3')
621 os.makedirs(path) # Should work
622 path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4')
623 os.makedirs(path)
624
625 # Try paths with a '.' in them
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000626 self.assertRaises(OSError, os.makedirs, os.curdir)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000627 path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4', 'dir5', os.curdir)
628 os.makedirs(path)
629 path = os.path.join(base, 'dir1', os.curdir, 'dir2', 'dir3', 'dir4',
630 'dir5', 'dir6')
631 os.makedirs(path)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000632
Terry Reedy5a22b652010-12-02 07:05:56 +0000633 def test_exist_ok_existing_directory(self):
634 path = os.path.join(support.TESTFN, 'dir1')
635 mode = 0o777
636 old_mask = os.umask(0o022)
637 os.makedirs(path, mode)
638 self.assertRaises(OSError, os.makedirs, path, mode)
639 self.assertRaises(OSError, os.makedirs, path, mode, exist_ok=False)
640 self.assertRaises(OSError, os.makedirs, path, 0o776, exist_ok=True)
641 os.makedirs(path, mode=mode, exist_ok=True)
642 os.umask(old_mask)
643
644 def test_exist_ok_existing_regular_file(self):
645 base = support.TESTFN
646 path = os.path.join(support.TESTFN, 'dir1')
647 f = open(path, 'w')
648 f.write('abc')
649 f.close()
650 self.assertRaises(OSError, os.makedirs, path)
651 self.assertRaises(OSError, os.makedirs, path, exist_ok=False)
652 self.assertRaises(OSError, os.makedirs, path, exist_ok=True)
653 os.remove(path)
654
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000655 def tearDown(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000656 path = os.path.join(support.TESTFN, 'dir1', 'dir2', 'dir3',
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000657 'dir4', 'dir5', 'dir6')
658 # If the tests failed, the bottom-most directory ('../dir6')
659 # may not have been created, so we look for the outermost directory
660 # that exists.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000661 while not os.path.exists(path) and path != support.TESTFN:
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000662 path = os.path.dirname(path)
663
664 os.removedirs(path)
665
Guido van Rossume7ba4952007-06-06 23:52:48 +0000666class DevNullTests(unittest.TestCase):
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000667 def test_devnull(self):
Alex Martelli01c77c62006-08-24 02:58:11 +0000668 f = open(os.devnull, 'w')
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000669 f.write('hello')
670 f.close()
Alex Martelli01c77c62006-08-24 02:58:11 +0000671 f = open(os.devnull, 'r')
Tim Peters4182cfd2004-06-08 20:34:34 +0000672 self.assertEqual(f.read(), '')
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000673 f.close()
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000674
Guido van Rossume7ba4952007-06-06 23:52:48 +0000675class URandomTests(unittest.TestCase):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000676 def test_urandom(self):
677 try:
678 self.assertEqual(len(os.urandom(1)), 1)
679 self.assertEqual(len(os.urandom(10)), 10)
680 self.assertEqual(len(os.urandom(100)), 100)
681 self.assertEqual(len(os.urandom(1000)), 1000)
682 except NotImplementedError:
683 pass
684
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000685@contextlib.contextmanager
686def _execvpe_mockup(defpath=None):
687 """
688 Stubs out execv and execve functions when used as context manager.
689 Records exec calls. The mock execv and execve functions always raise an
690 exception as they would normally never return.
691 """
692 # A list of tuples containing (function name, first arg, args)
693 # of calls to execv or execve that have been made.
694 calls = []
695
696 def mock_execv(name, *args):
697 calls.append(('execv', name, args))
698 raise RuntimeError("execv called")
699
700 def mock_execve(name, *args):
701 calls.append(('execve', name, args))
702 raise OSError(errno.ENOTDIR, "execve called")
703
704 try:
705 orig_execv = os.execv
706 orig_execve = os.execve
707 orig_defpath = os.defpath
708 os.execv = mock_execv
709 os.execve = mock_execve
710 if defpath is not None:
711 os.defpath = defpath
712 yield calls
713 finally:
714 os.execv = orig_execv
715 os.execve = orig_execve
716 os.defpath = orig_defpath
717
Guido van Rossume7ba4952007-06-06 23:52:48 +0000718class ExecTests(unittest.TestCase):
Mark Dickinson7cf03892010-04-16 13:45:35 +0000719 @unittest.skipIf(USING_LINUXTHREADS,
720 "avoid triggering a linuxthreads bug: see issue #4970")
Guido van Rossume7ba4952007-06-06 23:52:48 +0000721 def test_execvpe_with_bad_program(self):
Mark Dickinson7cf03892010-04-16 13:45:35 +0000722 self.assertRaises(OSError, os.execvpe, 'no such app-',
723 ['no such app-'], None)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000724
Thomas Heller6790d602007-08-30 17:15:14 +0000725 def test_execvpe_with_bad_arglist(self):
726 self.assertRaises(ValueError, os.execvpe, 'notepad', [], None)
727
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000728 @unittest.skipUnless(hasattr(os, '_execvpe'),
729 "No internal os._execvpe function to test.")
Victor Stinnerb745a742010-05-18 17:17:23 +0000730 def _test_internal_execvpe(self, test_type):
731 program_path = os.sep + 'absolutepath'
732 if test_type is bytes:
733 program = b'executable'
734 fullpath = os.path.join(os.fsencode(program_path), program)
735 native_fullpath = fullpath
736 arguments = [b'progname', 'arg1', 'arg2']
737 else:
738 program = 'executable'
739 arguments = ['progname', 'arg1', 'arg2']
740 fullpath = os.path.join(program_path, program)
741 if os.name != "nt":
742 native_fullpath = os.fsencode(fullpath)
743 else:
744 native_fullpath = fullpath
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000745 env = {'spam': 'beans'}
746
Victor Stinnerb745a742010-05-18 17:17:23 +0000747 # test os._execvpe() with an absolute path
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000748 with _execvpe_mockup() as calls:
Victor Stinnerb745a742010-05-18 17:17:23 +0000749 self.assertRaises(RuntimeError,
750 os._execvpe, fullpath, arguments)
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000751 self.assertEqual(len(calls), 1)
752 self.assertEqual(calls[0], ('execv', fullpath, (arguments,)))
753
Victor Stinnerb745a742010-05-18 17:17:23 +0000754 # test os._execvpe() with a relative path:
755 # os.get_exec_path() returns defpath
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000756 with _execvpe_mockup(defpath=program_path) as calls:
Victor Stinnerb745a742010-05-18 17:17:23 +0000757 self.assertRaises(OSError,
758 os._execvpe, program, arguments, env=env)
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000759 self.assertEqual(len(calls), 1)
Victor Stinnerb745a742010-05-18 17:17:23 +0000760 self.assertSequenceEqual(calls[0],
761 ('execve', native_fullpath, (arguments, env)))
762
763 # test os._execvpe() with a relative path:
764 # os.get_exec_path() reads the 'PATH' variable
765 with _execvpe_mockup() as calls:
766 env_path = env.copy()
Victor Stinner38430e22010-08-19 17:10:18 +0000767 if test_type is bytes:
768 env_path[b'PATH'] = program_path
769 else:
770 env_path['PATH'] = program_path
Victor Stinnerb745a742010-05-18 17:17:23 +0000771 self.assertRaises(OSError,
772 os._execvpe, program, arguments, env=env_path)
773 self.assertEqual(len(calls), 1)
774 self.assertSequenceEqual(calls[0],
775 ('execve', native_fullpath, (arguments, env_path)))
776
777 def test_internal_execvpe_str(self):
778 self._test_internal_execvpe(str)
779 if os.name != "nt":
780 self._test_internal_execvpe(bytes)
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000781
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000782
Thomas Wouters477c8d52006-05-27 19:21:47 +0000783class Win32ErrorTests(unittest.TestCase):
784 def test_rename(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000785 self.assertRaises(WindowsError, os.rename, support.TESTFN, support.TESTFN+".bak")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000786
787 def test_remove(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000788 self.assertRaises(WindowsError, os.remove, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000789
790 def test_chdir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000791 self.assertRaises(WindowsError, os.chdir, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000792
793 def test_mkdir(self):
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000794 f = open(support.TESTFN, "w")
Benjamin Petersonf91df042009-02-13 02:50:59 +0000795 try:
796 self.assertRaises(WindowsError, os.mkdir, support.TESTFN)
797 finally:
798 f.close()
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000799 os.unlink(support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000800
801 def test_utime(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000802 self.assertRaises(WindowsError, os.utime, support.TESTFN, None)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000803
Thomas Wouters477c8d52006-05-27 19:21:47 +0000804 def test_chmod(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000805 self.assertRaises(WindowsError, os.chmod, support.TESTFN, 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000806
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000807class TestInvalidFD(unittest.TestCase):
Benjamin Peterson05e782f2009-01-19 15:15:02 +0000808 singles = ["fchdir", "dup", "fdopen", "fdatasync", "fstat",
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000809 "fstatvfs", "fsync", "tcgetpgrp", "ttyname"]
810 #singles.append("close")
811 #We omit close because it doesn'r raise an exception on some platforms
812 def get_single(f):
813 def helper(self):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000814 if hasattr(os, f):
815 self.check(getattr(os, f))
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000816 return helper
817 for f in singles:
818 locals()["test_"+f] = get_single(f)
819
Benjamin Peterson7522c742009-01-19 21:00:09 +0000820 def check(self, f, *args):
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000821 try:
822 f(support.make_bad_fd(), *args)
823 except OSError as e:
824 self.assertEqual(e.errno, errno.EBADF)
825 else:
826 self.fail("%r didn't raise a OSError with a bad file descriptor"
827 % f)
Benjamin Peterson7522c742009-01-19 21:00:09 +0000828
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000829 def test_isatty(self):
830 if hasattr(os, "isatty"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000831 self.assertEqual(os.isatty(support.make_bad_fd()), False)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000832
833 def test_closerange(self):
834 if hasattr(os, "closerange"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000835 fd = support.make_bad_fd()
R. David Murray630cc482009-07-22 15:20:27 +0000836 # Make sure none of the descriptors we are about to close are
837 # currently valid (issue 6542).
838 for i in range(10):
839 try: os.fstat(fd+i)
840 except OSError:
841 pass
842 else:
843 break
844 if i < 2:
845 raise unittest.SkipTest(
846 "Unable to acquire a range of invalid file descriptors")
847 self.assertEqual(os.closerange(fd, fd + i-1), None)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000848
849 def test_dup2(self):
850 if hasattr(os, "dup2"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000851 self.check(os.dup2, 20)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000852
853 def test_fchmod(self):
854 if hasattr(os, "fchmod"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000855 self.check(os.fchmod, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000856
857 def test_fchown(self):
858 if hasattr(os, "fchown"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000859 self.check(os.fchown, -1, -1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000860
861 def test_fpathconf(self):
862 if hasattr(os, "fpathconf"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000863 self.check(os.fpathconf, "PC_NAME_MAX")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000864
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000865 def test_ftruncate(self):
866 if hasattr(os, "ftruncate"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000867 self.check(os.ftruncate, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000868
869 def test_lseek(self):
870 if hasattr(os, "lseek"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000871 self.check(os.lseek, 0, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000872
873 def test_read(self):
874 if hasattr(os, "read"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000875 self.check(os.read, 1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000876
877 def test_tcsetpgrpt(self):
878 if hasattr(os, "tcsetpgrp"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000879 self.check(os.tcsetpgrp, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000880
881 def test_write(self):
882 if hasattr(os, "write"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000883 self.check(os.write, b" ")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000884
Brian Curtin1b9df392010-11-24 20:24:31 +0000885
886class LinkTests(unittest.TestCase):
887 def setUp(self):
888 self.file1 = support.TESTFN
889 self.file2 = os.path.join(support.TESTFN + "2")
890
Brian Curtinc0abc4e2010-11-30 23:46:54 +0000891 def tearDown(self):
Brian Curtin1b9df392010-11-24 20:24:31 +0000892 for file in (self.file1, self.file2):
893 if os.path.exists(file):
894 os.unlink(file)
895
Brian Curtin1b9df392010-11-24 20:24:31 +0000896 def _test_link(self, file1, file2):
897 with open(file1, "w") as f1:
898 f1.write("test")
899
900 os.link(file1, file2)
901 with open(file1, "r") as f1, open(file2, "r") as f2:
902 self.assertTrue(os.path.sameopenfile(f1.fileno(), f2.fileno()))
903
904 def test_link(self):
905 self._test_link(self.file1, self.file2)
906
907 def test_link_bytes(self):
908 self._test_link(bytes(self.file1, sys.getfilesystemencoding()),
909 bytes(self.file2, sys.getfilesystemencoding()))
910
Brian Curtinf498b752010-11-30 15:54:04 +0000911 def test_unicode_name(self):
Brian Curtin43f0c272010-11-30 15:40:04 +0000912 try:
Brian Curtinf498b752010-11-30 15:54:04 +0000913 os.fsencode("\xf1")
Brian Curtin43f0c272010-11-30 15:40:04 +0000914 except UnicodeError:
915 raise unittest.SkipTest("Unable to encode for this platform.")
916
Brian Curtinf498b752010-11-30 15:54:04 +0000917 self.file1 += "\xf1"
Brian Curtinfc889c42010-11-28 23:59:46 +0000918 self.file2 = self.file1 + "2"
919 self._test_link(self.file1, self.file2)
920
Thomas Wouters477c8d52006-05-27 19:21:47 +0000921if sys.platform != 'win32':
922 class Win32ErrorTests(unittest.TestCase):
923 pass
924
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000925 class PosixUidGidTests(unittest.TestCase):
926 if hasattr(os, 'setuid'):
927 def test_setuid(self):
928 if os.getuid() != 0:
929 self.assertRaises(os.error, os.setuid, 0)
930 self.assertRaises(OverflowError, os.setuid, 1<<32)
931
932 if hasattr(os, 'setgid'):
933 def test_setgid(self):
934 if os.getuid() != 0:
935 self.assertRaises(os.error, os.setgid, 0)
936 self.assertRaises(OverflowError, os.setgid, 1<<32)
937
938 if hasattr(os, 'seteuid'):
939 def test_seteuid(self):
940 if os.getuid() != 0:
941 self.assertRaises(os.error, os.seteuid, 0)
942 self.assertRaises(OverflowError, os.seteuid, 1<<32)
943
944 if hasattr(os, 'setegid'):
945 def test_setegid(self):
946 if os.getuid() != 0:
947 self.assertRaises(os.error, os.setegid, 0)
948 self.assertRaises(OverflowError, os.setegid, 1<<32)
949
950 if hasattr(os, 'setreuid'):
951 def test_setreuid(self):
952 if os.getuid() != 0:
953 self.assertRaises(os.error, os.setreuid, 0, 0)
954 self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
955 self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000956
957 def test_setreuid_neg1(self):
958 # Needs to accept -1. We run this in a subprocess to avoid
959 # altering the test runner's process state (issue8045).
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000960 subprocess.check_call([
961 sys.executable, '-c',
962 'import os,sys;os.setreuid(-1,-1);sys.exit(0)'])
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000963
964 if hasattr(os, 'setregid'):
965 def test_setregid(self):
966 if os.getuid() != 0:
967 self.assertRaises(os.error, os.setregid, 0, 0)
968 self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
969 self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000970
971 def test_setregid_neg1(self):
972 # Needs to accept -1. We run this in a subprocess to avoid
973 # altering the test runner's process state (issue8045).
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000974 subprocess.check_call([
975 sys.executable, '-c',
976 'import os,sys;os.setregid(-1,-1);sys.exit(0)'])
Martin v. Löwis011e8422009-05-05 04:43:17 +0000977
978 class Pep383Tests(unittest.TestCase):
Martin v. Löwis011e8422009-05-05 04:43:17 +0000979 def setUp(self):
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000980 if support.TESTFN_UNENCODABLE:
981 self.dir = support.TESTFN_UNENCODABLE
982 else:
983 self.dir = support.TESTFN
984 self.bdir = os.fsencode(self.dir)
985
986 bytesfn = []
987 def add_filename(fn):
988 try:
989 fn = os.fsencode(fn)
990 except UnicodeEncodeError:
991 return
992 bytesfn.append(fn)
993 add_filename(support.TESTFN_UNICODE)
994 if support.TESTFN_UNENCODABLE:
995 add_filename(support.TESTFN_UNENCODABLE)
996 if not bytesfn:
997 self.skipTest("couldn't create any non-ascii filename")
998
999 self.unicodefn = set()
Martin v. Löwis011e8422009-05-05 04:43:17 +00001000 os.mkdir(self.dir)
Victor Stinnerd91df1a2010-08-18 10:56:19 +00001001 try:
1002 for fn in bytesfn:
1003 f = open(os.path.join(self.bdir, fn), "w")
1004 f.close()
Victor Stinnere8d51452010-08-19 01:05:19 +00001005 fn = os.fsdecode(fn)
Victor Stinnerd91df1a2010-08-18 10:56:19 +00001006 if fn in self.unicodefn:
1007 raise ValueError("duplicate filename")
1008 self.unicodefn.add(fn)
1009 except:
1010 shutil.rmtree(self.dir)
1011 raise
Martin v. Löwis011e8422009-05-05 04:43:17 +00001012
1013 def tearDown(self):
1014 shutil.rmtree(self.dir)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001015
1016 def test_listdir(self):
Victor Stinnerd91df1a2010-08-18 10:56:19 +00001017 expected = self.unicodefn
1018 found = set(os.listdir(self.dir))
Ezio Melottib3aedd42010-11-20 19:04:17 +00001019 self.assertEqual(found, expected)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001020
1021 def test_open(self):
1022 for fn in self.unicodefn:
1023 f = open(os.path.join(self.dir, fn))
1024 f.close()
1025
1026 def test_stat(self):
1027 for fn in self.unicodefn:
1028 os.stat(os.path.join(self.dir, fn))
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001029else:
1030 class PosixUidGidTests(unittest.TestCase):
1031 pass
Martin v. Löwis011e8422009-05-05 04:43:17 +00001032 class Pep383Tests(unittest.TestCase):
1033 pass
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001034
Brian Curtineb24d742010-04-12 17:16:38 +00001035@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
1036class Win32KillTests(unittest.TestCase):
Brian Curtinc3acbc32010-05-28 16:08:40 +00001037 def _kill(self, sig):
1038 # Start sys.executable as a subprocess and communicate from the
1039 # subprocess to the parent that the interpreter is ready. When it
1040 # becomes ready, send *sig* via os.kill to the subprocess and check
1041 # that the return code is equal to *sig*.
1042 import ctypes
1043 from ctypes import wintypes
1044 import msvcrt
1045
1046 # Since we can't access the contents of the process' stdout until the
1047 # process has exited, use PeekNamedPipe to see what's inside stdout
1048 # without waiting. This is done so we can tell that the interpreter
1049 # is started and running at a point where it could handle a signal.
1050 PeekNamedPipe = ctypes.windll.kernel32.PeekNamedPipe
1051 PeekNamedPipe.restype = wintypes.BOOL
1052 PeekNamedPipe.argtypes = (wintypes.HANDLE, # Pipe handle
1053 ctypes.POINTER(ctypes.c_char), # stdout buf
1054 wintypes.DWORD, # Buffer size
1055 ctypes.POINTER(wintypes.DWORD), # bytes read
1056 ctypes.POINTER(wintypes.DWORD), # bytes avail
1057 ctypes.POINTER(wintypes.DWORD)) # bytes left
1058 msg = "running"
1059 proc = subprocess.Popen([sys.executable, "-c",
1060 "import sys;"
1061 "sys.stdout.write('{}');"
1062 "sys.stdout.flush();"
1063 "input()".format(msg)],
1064 stdout=subprocess.PIPE,
1065 stderr=subprocess.PIPE,
1066 stdin=subprocess.PIPE)
Brian Curtin43ec5772010-11-05 15:17:11 +00001067 self.addCleanup(proc.stdout.close)
1068 self.addCleanup(proc.stderr.close)
1069 self.addCleanup(proc.stdin.close)
Brian Curtinc3acbc32010-05-28 16:08:40 +00001070
1071 count, max = 0, 100
1072 while count < max and proc.poll() is None:
1073 # Create a string buffer to store the result of stdout from the pipe
1074 buf = ctypes.create_string_buffer(len(msg))
1075 # Obtain the text currently in proc.stdout
1076 # Bytes read/avail/left are left as NULL and unused
1077 rslt = PeekNamedPipe(msvcrt.get_osfhandle(proc.stdout.fileno()),
1078 buf, ctypes.sizeof(buf), None, None, None)
1079 self.assertNotEqual(rslt, 0, "PeekNamedPipe failed")
1080 if buf.value:
1081 self.assertEqual(msg, buf.value.decode())
1082 break
1083 time.sleep(0.1)
1084 count += 1
1085 else:
1086 self.fail("Did not receive communication from the subprocess")
1087
Brian Curtineb24d742010-04-12 17:16:38 +00001088 os.kill(proc.pid, sig)
1089 self.assertEqual(proc.wait(), sig)
1090
1091 def test_kill_sigterm(self):
1092 # SIGTERM doesn't mean anything special, but make sure it works
Brian Curtinc3acbc32010-05-28 16:08:40 +00001093 self._kill(signal.SIGTERM)
Brian Curtineb24d742010-04-12 17:16:38 +00001094
1095 def test_kill_int(self):
1096 # os.kill on Windows can take an int which gets set as the exit code
Brian Curtinc3acbc32010-05-28 16:08:40 +00001097 self._kill(100)
Brian Curtineb24d742010-04-12 17:16:38 +00001098
1099 def _kill_with_event(self, event, name):
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001100 tagname = "test_os_%s" % uuid.uuid1()
1101 m = mmap.mmap(-1, 1, tagname)
1102 m[0] = 0
Brian Curtineb24d742010-04-12 17:16:38 +00001103 # Run a script which has console control handling enabled.
1104 proc = subprocess.Popen([sys.executable,
1105 os.path.join(os.path.dirname(__file__),
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001106 "win_console_handler.py"), tagname],
Brian Curtineb24d742010-04-12 17:16:38 +00001107 creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
1108 # Let the interpreter startup before we send signals. See #3137.
Hirokazu Yamamoto8e9fe9f2010-12-05 02:41:46 +00001109 count, max = 0, 100
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001110 while count < max and proc.poll() is None:
Brian Curtinf668df52010-10-15 14:21:06 +00001111 if m[0] == 1:
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001112 break
Hirokazu Yamamoto8e9fe9f2010-12-05 02:41:46 +00001113 time.sleep(0.1)
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001114 count += 1
1115 else:
Hirokazu Yamamoto8e9fe9f2010-12-05 02:41:46 +00001116 # Forcefully kill the process if we weren't able to signal it.
1117 os.kill(proc.pid, signal.SIGINT)
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001118 self.fail("Subprocess didn't finish initialization")
Brian Curtineb24d742010-04-12 17:16:38 +00001119 os.kill(proc.pid, event)
1120 # proc.send_signal(event) could also be done here.
1121 # Allow time for the signal to be passed and the process to exit.
1122 time.sleep(0.5)
1123 if not proc.poll():
1124 # Forcefully kill the process if we weren't able to signal it.
1125 os.kill(proc.pid, signal.SIGINT)
1126 self.fail("subprocess did not stop on {}".format(name))
1127
1128 @unittest.skip("subprocesses aren't inheriting CTRL+C property")
1129 def test_CTRL_C_EVENT(self):
1130 from ctypes import wintypes
1131 import ctypes
1132
1133 # Make a NULL value by creating a pointer with no argument.
1134 NULL = ctypes.POINTER(ctypes.c_int)()
1135 SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
1136 SetConsoleCtrlHandler.argtypes = (ctypes.POINTER(ctypes.c_int),
1137 wintypes.BOOL)
1138 SetConsoleCtrlHandler.restype = wintypes.BOOL
1139
1140 # Calling this with NULL and FALSE causes the calling process to
1141 # handle CTRL+C, rather than ignore it. This property is inherited
1142 # by subprocesses.
1143 SetConsoleCtrlHandler(NULL, 0)
1144
1145 self._kill_with_event(signal.CTRL_C_EVENT, "CTRL_C_EVENT")
1146
1147 def test_CTRL_BREAK_EVENT(self):
1148 self._kill_with_event(signal.CTRL_BREAK_EVENT, "CTRL_BREAK_EVENT")
1149
1150
Brian Curtind40e6f72010-07-08 21:39:08 +00001151@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
Brian Curtin52173d42010-12-02 18:29:18 +00001152@unittest.skipUnless(hasattr(os, "symlink"), "Requires symlink implementation")
Brian Curtind40e6f72010-07-08 21:39:08 +00001153class Win32SymlinkTests(unittest.TestCase):
1154 filelink = 'filelinktest'
1155 filelink_target = os.path.abspath(__file__)
1156 dirlink = 'dirlinktest'
1157 dirlink_target = os.path.dirname(filelink_target)
1158 missing_link = 'missing link'
1159
1160 def setUp(self):
1161 assert os.path.exists(self.dirlink_target)
1162 assert os.path.exists(self.filelink_target)
1163 assert not os.path.exists(self.dirlink)
1164 assert not os.path.exists(self.filelink)
1165 assert not os.path.exists(self.missing_link)
1166
1167 def tearDown(self):
1168 if os.path.exists(self.filelink):
1169 os.remove(self.filelink)
1170 if os.path.exists(self.dirlink):
1171 os.rmdir(self.dirlink)
1172 if os.path.lexists(self.missing_link):
1173 os.remove(self.missing_link)
1174
1175 def test_directory_link(self):
1176 os.symlink(self.dirlink_target, self.dirlink)
1177 self.assertTrue(os.path.exists(self.dirlink))
1178 self.assertTrue(os.path.isdir(self.dirlink))
1179 self.assertTrue(os.path.islink(self.dirlink))
1180 self.check_stat(self.dirlink, self.dirlink_target)
1181
1182 def test_file_link(self):
1183 os.symlink(self.filelink_target, self.filelink)
1184 self.assertTrue(os.path.exists(self.filelink))
1185 self.assertTrue(os.path.isfile(self.filelink))
1186 self.assertTrue(os.path.islink(self.filelink))
1187 self.check_stat(self.filelink, self.filelink_target)
1188
1189 def _create_missing_dir_link(self):
1190 'Create a "directory" link to a non-existent target'
1191 linkname = self.missing_link
1192 if os.path.lexists(linkname):
1193 os.remove(linkname)
1194 target = r'c:\\target does not exist.29r3c740'
1195 assert not os.path.exists(target)
1196 target_is_dir = True
1197 os.symlink(target, linkname, target_is_dir)
1198
1199 def test_remove_directory_link_to_missing_target(self):
1200 self._create_missing_dir_link()
1201 # For compatibility with Unix, os.remove will check the
1202 # directory status and call RemoveDirectory if the symlink
1203 # was created with target_is_dir==True.
1204 os.remove(self.missing_link)
1205
1206 @unittest.skip("currently fails; consider for improvement")
1207 def test_isdir_on_directory_link_to_missing_target(self):
1208 self._create_missing_dir_link()
1209 # consider having isdir return true for directory links
1210 self.assertTrue(os.path.isdir(self.missing_link))
1211
1212 @unittest.skip("currently fails; consider for improvement")
1213 def test_rmdir_on_directory_link_to_missing_target(self):
1214 self._create_missing_dir_link()
1215 # consider allowing rmdir to remove directory links
1216 os.rmdir(self.missing_link)
1217
1218 def check_stat(self, link, target):
1219 self.assertEqual(os.stat(link), os.stat(target))
1220 self.assertNotEqual(os.lstat(link), os.stat(link))
1221
1222
Victor Stinnere8d51452010-08-19 01:05:19 +00001223class FSEncodingTests(unittest.TestCase):
1224 def test_nop(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001225 self.assertEqual(os.fsencode(b'abc\xff'), b'abc\xff')
1226 self.assertEqual(os.fsdecode('abc\u0141'), 'abc\u0141')
Benjamin Peterson31191a92010-05-09 03:22:58 +00001227
Victor Stinnere8d51452010-08-19 01:05:19 +00001228 def test_identity(self):
1229 # assert fsdecode(fsencode(x)) == x
1230 for fn in ('unicode\u0141', 'latin\xe9', 'ascii'):
1231 try:
1232 bytesfn = os.fsencode(fn)
1233 except UnicodeEncodeError:
1234 continue
Ezio Melottib3aedd42010-11-20 19:04:17 +00001235 self.assertEqual(os.fsdecode(bytesfn), fn)
Victor Stinnere8d51452010-08-19 01:05:19 +00001236
Victor Stinnerbf9bcab2010-05-09 03:15:33 +00001237
Amaury Forgeot d'Arc4b6fdf32010-09-07 21:31:17 +00001238class PidTests(unittest.TestCase):
1239 @unittest.skipUnless(hasattr(os, 'getppid'), "test needs os.getppid")
1240 def test_getppid(self):
1241 p = subprocess.Popen([sys.executable, '-c',
1242 'import os; print(os.getppid())'],
1243 stdout=subprocess.PIPE)
1244 stdout, _ = p.communicate()
1245 # We are the parent of our subprocess
1246 self.assertEqual(int(stdout), os.getpid())
1247
1248
Brian Curtin0151b8e2010-09-24 13:43:43 +00001249# The introduction of this TestCase caused at least two different errors on
1250# *nix buildbots. Temporarily skip this to let the buildbots move along.
1251@unittest.skip("Skip due to platform/environment differences on *NIX buildbots")
Brian Curtine8e4b3b2010-09-23 20:04:14 +00001252@unittest.skipUnless(hasattr(os, 'getlogin'), "test needs os.getlogin")
1253class LoginTests(unittest.TestCase):
1254 def test_getlogin(self):
1255 user_name = os.getlogin()
1256 self.assertNotEqual(len(user_name), 0)
1257
1258
Fred Drake2e2be372001-09-20 21:33:42 +00001259def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001260 support.run_unittest(
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001261 FileTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001262 StatAttributeTests,
1263 EnvironTests,
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +00001264 WalkTests,
1265 MakedirTests,
Martin v. Löwisbdec50f2004-06-08 08:29:33 +00001266 DevNullTests,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001267 URandomTests,
Guido van Rossume7ba4952007-06-06 23:52:48 +00001268 ExecTests,
Benjamin Petersone1cdfd72009-01-18 21:02:37 +00001269 Win32ErrorTests,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001270 TestInvalidFD,
Martin v. Löwis011e8422009-05-05 04:43:17 +00001271 PosixUidGidTests,
Brian Curtineb24d742010-04-12 17:16:38 +00001272 Pep383Tests,
Victor Stinnerbf9bcab2010-05-09 03:15:33 +00001273 Win32KillTests,
Brian Curtind40e6f72010-07-08 21:39:08 +00001274 Win32SymlinkTests,
Victor Stinnere8d51452010-08-19 01:05:19 +00001275 FSEncodingTests,
Amaury Forgeot d'Arc4b6fdf32010-09-07 21:31:17 +00001276 PidTests,
Brian Curtine8e4b3b2010-09-23 20:04:14 +00001277 LoginTests,
Brian Curtin1b9df392010-11-24 20:24:31 +00001278 LinkTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001279 )
Fred Drake2e2be372001-09-20 21:33:42 +00001280
1281if __name__ == "__main__":
1282 test_main()