blob: 605d2a4632f42517064fac28d19179f3131d72d6 [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
Gregory P. Smitha81c8562012-06-03 14:30:44 -070018import stat
Georg Brandl2daf6ae2012-02-20 19:54:16 +010019from test.script_helper import assert_python_ok
Fred Drake38c2ef02001-07-17 20:52:51 +000020
Mark Dickinson7cf03892010-04-16 13:45:35 +000021# Detect whether we're on a Linux system that uses the (now outdated
22# and unmaintained) linuxthreads threading library. There's an issue
23# when combining linuxthreads with a failed execv call: see
24# http://bugs.python.org/issue4970.
Mark Dickinson89589c92010-04-16 13:51:27 +000025if (hasattr(os, "confstr_names") and
26 "CS_GNU_LIBPTHREAD_VERSION" in os.confstr_names):
Mark Dickinson7cf03892010-04-16 13:45:35 +000027 libpthread = os.confstr("CS_GNU_LIBPTHREAD_VERSION")
28 USING_LINUXTHREADS= libpthread.startswith("linuxthreads")
29else:
30 USING_LINUXTHREADS= False
Brian Curtineb24d742010-04-12 17:16:38 +000031
Thomas Wouters0e3f5912006-08-11 14:57:12 +000032# Tests creating TESTFN
33class FileTests(unittest.TestCase):
34 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035 if os.path.exists(support.TESTFN):
36 os.unlink(support.TESTFN)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000037 tearDown = setUp
38
39 def test_access(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000040 f = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000041 os.close(f)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000042 self.assertTrue(os.access(support.TESTFN, os.W_OK))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000043
Christian Heimesfdab48e2008-01-20 09:06:41 +000044 def test_closerange(self):
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000045 first = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR)
46 # We must allocate two consecutive file descriptors, otherwise
47 # it will mess up other file descriptors (perhaps even the three
48 # standard ones).
49 second = os.dup(first)
50 try:
51 retries = 0
52 while second != first + 1:
53 os.close(first)
54 retries += 1
55 if retries > 10:
56 # XXX test skipped
Benjamin Petersonfa0d7032009-06-01 22:42:33 +000057 self.skipTest("couldn't allocate two consecutive fds")
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000058 first, second = second, os.dup(second)
59 finally:
60 os.close(second)
Christian Heimesfdab48e2008-01-20 09:06:41 +000061 # close a fd that is open, and one that isn't
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000062 os.closerange(first, first + 2)
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000063 self.assertRaises(OSError, os.write, first, b"a")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000064
Benjamin Peterson1cc6df92010-06-30 17:39:45 +000065 @support.cpython_only
Hirokazu Yamamoto4c19e6e2008-09-08 23:41:21 +000066 def test_rename(self):
67 path = support.TESTFN
68 old = sys.getrefcount(path)
69 self.assertRaises(TypeError, os.rename, path, 0)
70 new = sys.getrefcount(path)
71 self.assertEqual(old, new)
72
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000073 def test_read(self):
74 with open(support.TESTFN, "w+b") as fobj:
75 fobj.write(b"spam")
76 fobj.flush()
77 fd = fobj.fileno()
78 os.lseek(fd, 0, 0)
79 s = os.read(fd, 4)
80 self.assertEqual(type(s), bytes)
81 self.assertEqual(s, b"spam")
82
83 def test_write(self):
84 # os.write() accepts bytes- and buffer-like objects but not strings
85 fd = os.open(support.TESTFN, os.O_CREAT | os.O_WRONLY)
86 self.assertRaises(TypeError, os.write, fd, "beans")
87 os.write(fd, b"bacon\n")
88 os.write(fd, bytearray(b"eggs\n"))
89 os.write(fd, memoryview(b"spam\n"))
90 os.close(fd)
91 with open(support.TESTFN, "rb") as fobj:
Antoine Pitroud62269f2008-09-15 23:54:52 +000092 self.assertEqual(fobj.read().splitlines(),
93 [b"bacon", b"eggs", b"spam"])
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000094
Victor Stinnere0daff12011-03-20 23:36:35 +010095 def write_windows_console(self, *args):
96 retcode = subprocess.call(args,
97 # use a new console to not flood the test output
98 creationflags=subprocess.CREATE_NEW_CONSOLE,
99 # use a shell to hide the console window (SW_HIDE)
100 shell=True)
101 self.assertEqual(retcode, 0)
102
103 @unittest.skipUnless(sys.platform == 'win32',
104 'test specific to the Windows console')
105 def test_write_windows_console(self):
106 # Issue #11395: the Windows console returns an error (12: not enough
107 # space error) on writing into stdout if stdout mode is binary and the
108 # length is greater than 66,000 bytes (or less, depending on heap
109 # usage).
110 code = "print('x' * 100000)"
111 self.write_windows_console(sys.executable, "-c", code)
112 self.write_windows_console(sys.executable, "-u", "-c", code)
113
Amaury Forgeot d'Arce2e36ba2008-08-01 00:14:22 +0000114 def fdopen_helper(self, *args):
115 fd = os.open(support.TESTFN, os.O_RDONLY)
Victor Stinnerbef7fdf2011-07-01 13:45:30 +0200116 f = os.fdopen(fd, *args)
117 f.close()
Amaury Forgeot d'Arce2e36ba2008-08-01 00:14:22 +0000118
119 def test_fdopen(self):
Victor Stinnerbef7fdf2011-07-01 13:45:30 +0200120 fd = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR)
121 os.close(fd)
122
Amaury Forgeot d'Arce2e36ba2008-08-01 00:14:22 +0000123 self.fdopen_helper()
124 self.fdopen_helper('r')
125 self.fdopen_helper('r', 100)
126
Victor Stinnerbef7fdf2011-07-01 13:45:30 +0200127
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000128# Test attributes on return values from os.*stat* family.
129class StatAttributeTests(unittest.TestCase):
130 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000131 os.mkdir(support.TESTFN)
132 self.fname = os.path.join(support.TESTFN, "f1")
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000133 f = open(self.fname, 'wb')
Guido van Rossum26d95c32007-08-27 23:18:54 +0000134 f.write(b"ABC")
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000135 f.close()
Tim Peterse0c446b2001-10-18 21:57:37 +0000136
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000137 def tearDown(self):
138 os.unlink(self.fname)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000139 os.rmdir(support.TESTFN)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000140
Antoine Pitrou38425292010-09-21 18:19:07 +0000141 def check_stat_attributes(self, fname):
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000142 if not hasattr(os, "stat"):
143 return
144
145 import stat
Antoine Pitrou38425292010-09-21 18:19:07 +0000146 result = os.stat(fname)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000147
148 # Make sure direct access works
Ezio Melottib3aedd42010-11-20 19:04:17 +0000149 self.assertEqual(result[stat.ST_SIZE], 3)
150 self.assertEqual(result.st_size, 3)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000151
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000152 # Make sure all the attributes are there
153 members = dir(result)
154 for name in dir(stat):
155 if name[:3] == 'ST_':
156 attr = name.lower()
Martin v. Löwis4d394df2005-01-23 09:19:22 +0000157 if name.endswith("TIME"):
158 def trunc(x): return int(x)
159 else:
160 def trunc(x): return x
Ezio Melottib3aedd42010-11-20 19:04:17 +0000161 self.assertEqual(trunc(getattr(result, attr)),
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000162 result[getattr(stat, name)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000163 self.assertIn(attr, members)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000164
165 try:
166 result[200]
167 self.fail("No exception thrown")
168 except IndexError:
169 pass
170
171 # Make sure that assignment fails
172 try:
173 result.st_mode = 1
174 self.fail("No exception thrown")
Collin Winter42dae6a2007-03-28 21:44:53 +0000175 except AttributeError:
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000176 pass
177
178 try:
179 result.st_rdev = 1
180 self.fail("No exception thrown")
Guido van Rossum1fff8782001-10-18 21:19:31 +0000181 except (AttributeError, TypeError):
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000182 pass
183
184 try:
185 result.parrot = 1
186 self.fail("No exception thrown")
187 except AttributeError:
188 pass
189
190 # Use the stat_result constructor with a too-short tuple.
191 try:
192 result2 = os.stat_result((10,))
193 self.fail("No exception thrown")
194 except TypeError:
195 pass
196
Ezio Melotti42da6632011-03-15 05:18:48 +0200197 # Use the constructor with a too-long tuple.
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000198 try:
199 result2 = os.stat_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14))
200 except TypeError:
201 pass
202
Antoine Pitrou38425292010-09-21 18:19:07 +0000203 def test_stat_attributes(self):
204 self.check_stat_attributes(self.fname)
205
206 def test_stat_attributes_bytes(self):
207 try:
208 fname = self.fname.encode(sys.getfilesystemencoding())
209 except UnicodeEncodeError:
210 self.skipTest("cannot encode %a for the filesystem" % self.fname)
211 self.check_stat_attributes(fname)
Tim Peterse0c446b2001-10-18 21:57:37 +0000212
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000213 def test_statvfs_attributes(self):
214 if not hasattr(os, "statvfs"):
215 return
216
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000217 try:
218 result = os.statvfs(self.fname)
Guido van Rossumb940e112007-01-10 16:19:56 +0000219 except OSError as e:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000220 # On AtheOS, glibc always returns ENOSYS
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000221 if e.errno == errno.ENOSYS:
222 return
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000223
224 # Make sure direct access works
Ezio Melottib3aedd42010-11-20 19:04:17 +0000225 self.assertEqual(result.f_bfree, result[3])
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000226
Brett Cannoncfaf10c2008-05-16 00:45:35 +0000227 # Make sure all the attributes are there.
228 members = ('bsize', 'frsize', 'blocks', 'bfree', 'bavail', 'files',
229 'ffree', 'favail', 'flag', 'namemax')
230 for value, member in enumerate(members):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000231 self.assertEqual(getattr(result, 'f_' + member), result[value])
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000232
233 # Make sure that assignment really fails
234 try:
235 result.f_bfree = 1
236 self.fail("No exception thrown")
Collin Winter42dae6a2007-03-28 21:44:53 +0000237 except AttributeError:
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000238 pass
239
240 try:
241 result.parrot = 1
242 self.fail("No exception thrown")
243 except AttributeError:
244 pass
245
246 # Use the constructor with a too-short tuple.
247 try:
248 result2 = os.statvfs_result((10,))
249 self.fail("No exception thrown")
250 except TypeError:
251 pass
252
Ezio Melotti42da6632011-03-15 05:18:48 +0200253 # Use the constructor with a too-long tuple.
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000254 try:
255 result2 = os.statvfs_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14))
256 except TypeError:
257 pass
Fred Drake38c2ef02001-07-17 20:52:51 +0000258
Thomas Wouters89f507f2006-12-13 04:49:30 +0000259 def test_utime_dir(self):
260 delta = 1000000
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000261 st = os.stat(support.TESTFN)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000262 # round to int, because some systems may support sub-second
263 # time stamps in stat, but not in utime.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000264 os.utime(support.TESTFN, (st.st_atime, int(st.st_mtime-delta)))
265 st2 = os.stat(support.TESTFN)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000266 self.assertEqual(st2.st_mtime, int(st.st_mtime-delta))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000267
268 # Restrict test to Win32, since there is no guarantee other
269 # systems support centiseconds
270 if sys.platform == 'win32':
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000271 def get_file_system(path):
Hirokazu Yamamoto5ef6d182008-08-20 04:17:24 +0000272 root = os.path.splitdrive(os.path.abspath(path))[0] + '\\'
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000273 import ctypes
Hirokazu Yamamotoca765d52008-08-20 16:18:19 +0000274 kernel32 = ctypes.windll.kernel32
Hirokazu Yamamoto5ef6d182008-08-20 04:17:24 +0000275 buf = ctypes.create_unicode_buffer("", 100)
Hirokazu Yamamotoca765d52008-08-20 16:18:19 +0000276 if kernel32.GetVolumeInformationW(root, None, 0, None, None, None, buf, len(buf)):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000277 return buf.value
278
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000279 if get_file_system(support.TESTFN) == "NTFS":
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000280 def test_1565150(self):
281 t1 = 1159195039.25
282 os.utime(self.fname, (t1, t1))
Ezio Melottib3aedd42010-11-20 19:04:17 +0000283 self.assertEqual(os.stat(self.fname).st_mtime, t1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000284
Amaury Forgeot d'Arca251a852011-01-03 00:19:11 +0000285 def test_large_time(self):
286 t1 = 5000000000 # some day in 2128
287 os.utime(self.fname, (t1, t1))
288 self.assertEqual(os.stat(self.fname).st_mtime, t1)
289
Guido van Rossumd8faa362007-04-27 19:54:29 +0000290 def test_1686475(self):
291 # Verify that an open file can be stat'ed
292 try:
293 os.stat(r"c:\pagefile.sys")
294 except WindowsError as e:
Benjamin Petersonc4fe6f32008-08-19 18:57:56 +0000295 if e.errno == 2: # file does not exist; cannot run test
Guido van Rossumd8faa362007-04-27 19:54:29 +0000296 return
297 self.fail("Could not stat pagefile.sys")
298
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000299from test import mapping_tests
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000300
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000301class EnvironTests(mapping_tests.BasicTestMappingProtocol):
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000302 """check that os.environ object conform to mapping protocol"""
Walter Dörwald118f9312004-06-02 18:42:25 +0000303 type2test = None
Christian Heimes90333392007-11-01 19:08:42 +0000304
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000305 def setUp(self):
306 self.__save = dict(os.environ)
Victor Stinnerb745a742010-05-18 17:17:23 +0000307 if os.supports_bytes_environ:
Victor Stinner208d28c2010-05-07 00:54:14 +0000308 self.__saveb = dict(os.environb)
Christian Heimes90333392007-11-01 19:08:42 +0000309 for key, value in self._reference().items():
310 os.environ[key] = value
311
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000312 def tearDown(self):
313 os.environ.clear()
314 os.environ.update(self.__save)
Victor Stinnerb745a742010-05-18 17:17:23 +0000315 if os.supports_bytes_environ:
Victor Stinner208d28c2010-05-07 00:54:14 +0000316 os.environb.clear()
317 os.environb.update(self.__saveb)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000318
Christian Heimes90333392007-11-01 19:08:42 +0000319 def _reference(self):
320 return {"KEY1":"VALUE1", "KEY2":"VALUE2", "KEY3":"VALUE3"}
321
322 def _empty_mapping(self):
323 os.environ.clear()
324 return os.environ
325
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000326 # Bug 1110478
Martin v. Löwis5510f652005-02-17 21:23:20 +0000327 def test_update2(self):
Christian Heimes90333392007-11-01 19:08:42 +0000328 os.environ.clear()
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000329 if os.path.exists("/bin/sh"):
330 os.environ.update(HELLO="World")
Brian Curtin810921b2010-10-30 21:24:21 +0000331 with os.popen("/bin/sh -c 'echo $HELLO'") as popen:
332 value = popen.read().strip()
Ezio Melottib3aedd42010-11-20 19:04:17 +0000333 self.assertEqual(value, "World")
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000334
Christian Heimes1a13d592007-11-08 14:16:55 +0000335 def test_os_popen_iter(self):
336 if os.path.exists("/bin/sh"):
Brian Curtin810921b2010-10-30 21:24:21 +0000337 with os.popen(
338 "/bin/sh -c 'echo \"line1\nline2\nline3\"'") as popen:
339 it = iter(popen)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000340 self.assertEqual(next(it), "line1\n")
341 self.assertEqual(next(it), "line2\n")
342 self.assertEqual(next(it), "line3\n")
Brian Curtin810921b2010-10-30 21:24:21 +0000343 self.assertRaises(StopIteration, next, it)
Christian Heimes1a13d592007-11-08 14:16:55 +0000344
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000345 # Verify environ keys and values from the OS are of the
346 # correct str type.
347 def test_keyvalue_types(self):
348 for key, val in os.environ.items():
Ezio Melottib3aedd42010-11-20 19:04:17 +0000349 self.assertEqual(type(key), str)
350 self.assertEqual(type(val), str)
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000351
Christian Heimes90333392007-11-01 19:08:42 +0000352 def test_items(self):
353 for key, value in self._reference().items():
354 self.assertEqual(os.environ.get(key), value)
355
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000356 # Issue 7310
357 def test___repr__(self):
358 """Check that the repr() of os.environ looks like environ({...})."""
359 env = os.environ
Victor Stinner96f0de92010-07-29 00:29:00 +0000360 self.assertEqual(repr(env), 'environ({{{}}})'.format(', '.join(
361 '{!r}: {!r}'.format(key, value)
362 for key, value in env.items())))
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000363
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000364 def test_get_exec_path(self):
365 defpath_list = os.defpath.split(os.pathsep)
366 test_path = ['/monty', '/python', '', '/flying/circus']
367 test_env = {'PATH': os.pathsep.join(test_path)}
368
369 saved_environ = os.environ
370 try:
371 os.environ = dict(test_env)
372 # Test that defaulting to os.environ works.
373 self.assertSequenceEqual(test_path, os.get_exec_path())
374 self.assertSequenceEqual(test_path, os.get_exec_path(env=None))
375 finally:
376 os.environ = saved_environ
377
378 # No PATH environment variable
379 self.assertSequenceEqual(defpath_list, os.get_exec_path({}))
380 # Empty PATH environment variable
381 self.assertSequenceEqual(('',), os.get_exec_path({'PATH':''}))
382 # Supplied PATH environment variable
383 self.assertSequenceEqual(test_path, os.get_exec_path(test_env))
384
Victor Stinnerb745a742010-05-18 17:17:23 +0000385 if os.supports_bytes_environ:
386 # env cannot contain 'PATH' and b'PATH' keys
Victor Stinner38430e22010-08-19 17:10:18 +0000387 try:
Victor Stinner6f35eda2010-10-29 00:38:58 +0000388 # ignore BytesWarning warning
389 with warnings.catch_warnings(record=True):
390 mixed_env = {'PATH': '1', b'PATH': b'2'}
Victor Stinner38430e22010-08-19 17:10:18 +0000391 except BytesWarning:
Victor Stinner6f35eda2010-10-29 00:38:58 +0000392 # mixed_env cannot be created with python -bb
Victor Stinner38430e22010-08-19 17:10:18 +0000393 pass
394 else:
395 self.assertRaises(ValueError, os.get_exec_path, mixed_env)
Victor Stinnerb745a742010-05-18 17:17:23 +0000396
397 # bytes key and/or value
398 self.assertSequenceEqual(os.get_exec_path({b'PATH': b'abc'}),
399 ['abc'])
400 self.assertSequenceEqual(os.get_exec_path({b'PATH': 'abc'}),
401 ['abc'])
402 self.assertSequenceEqual(os.get_exec_path({'PATH': b'abc'}),
403 ['abc'])
404
405 @unittest.skipUnless(os.supports_bytes_environ,
406 "os.environb required for this test.")
Victor Stinner84ae1182010-05-06 22:05:07 +0000407 def test_environb(self):
408 # os.environ -> os.environb
409 value = 'euro\u20ac'
410 try:
Benjamin Peterson180799d2010-05-06 22:25:42 +0000411 value_bytes = value.encode(sys.getfilesystemencoding(),
412 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000413 except UnicodeEncodeError:
Benjamin Peterson180799d2010-05-06 22:25:42 +0000414 msg = "U+20AC character is not encodable to %s" % (
415 sys.getfilesystemencoding(),)
Benjamin Peterson932d3f42010-05-06 22:26:31 +0000416 self.skipTest(msg)
Victor Stinner84ae1182010-05-06 22:05:07 +0000417 os.environ['unicode'] = value
Ezio Melottib3aedd42010-11-20 19:04:17 +0000418 self.assertEqual(os.environ['unicode'], value)
419 self.assertEqual(os.environb[b'unicode'], value_bytes)
Victor Stinner84ae1182010-05-06 22:05:07 +0000420
421 # os.environb -> os.environ
422 value = b'\xff'
423 os.environb[b'bytes'] = value
Ezio Melottib3aedd42010-11-20 19:04:17 +0000424 self.assertEqual(os.environb[b'bytes'], value)
Victor Stinner84ae1182010-05-06 22:05:07 +0000425 value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape')
Ezio Melottib3aedd42010-11-20 19:04:17 +0000426 self.assertEqual(os.environ['bytes'], value_str)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000427
Charles-François Natali7be8f682011-11-27 12:49:27 +0100428 # On FreeBSD < 7 and OS X < 10.6, unsetenv() doesn't return a value (issue
429 # #13415).
430 @unittest.skipIf(sys.platform.startswith(('freebsd', 'darwin')),
431 "due to known OS bug: see issue #13415")
Victor Stinner60b385e2011-11-22 22:01:28 +0100432 def test_unset_error(self):
433 if sys.platform == "win32":
434 # an environment variable is limited to 32,767 characters
435 key = 'x' * 50000
Victor Stinnerb3f82682011-11-22 22:30:19 +0100436 self.assertRaises(ValueError, os.environ.__delitem__, key)
Victor Stinner60b385e2011-11-22 22:01:28 +0100437 else:
438 # "=" is not allowed in a variable name
439 key = 'key='
Victor Stinnerb3f82682011-11-22 22:30:19 +0100440 self.assertRaises(OSError, os.environ.__delitem__, key)
Victor Stinner60b385e2011-11-22 22:01:28 +0100441
Tim Petersc4e09402003-04-25 07:11:48 +0000442class WalkTests(unittest.TestCase):
443 """Tests for os.walk()."""
444
445 def test_traversal(self):
446 import os
447 from os.path import join
448
449 # Build:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000450 # TESTFN/
451 # TEST1/ a file kid and two directory kids
Tim Petersc4e09402003-04-25 07:11:48 +0000452 # tmp1
453 # SUB1/ a file kid and a directory kid
Guido van Rossumd8faa362007-04-27 19:54:29 +0000454 # tmp2
455 # SUB11/ no kids
456 # SUB2/ a file kid and a dirsymlink kid
457 # tmp3
458 # link/ a symlink to TESTFN.2
459 # TEST2/
460 # tmp4 a lone file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000461 walk_path = join(support.TESTFN, "TEST1")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000462 sub1_path = join(walk_path, "SUB1")
Tim Petersc4e09402003-04-25 07:11:48 +0000463 sub11_path = join(sub1_path, "SUB11")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000464 sub2_path = join(walk_path, "SUB2")
465 tmp1_path = join(walk_path, "tmp1")
Tim Petersc4e09402003-04-25 07:11:48 +0000466 tmp2_path = join(sub1_path, "tmp2")
467 tmp3_path = join(sub2_path, "tmp3")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000468 link_path = join(sub2_path, "link")
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000469 t2_path = join(support.TESTFN, "TEST2")
470 tmp4_path = join(support.TESTFN, "TEST2", "tmp4")
Tim Petersc4e09402003-04-25 07:11:48 +0000471
472 # Create stuff.
473 os.makedirs(sub11_path)
474 os.makedirs(sub2_path)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000475 os.makedirs(t2_path)
476 for path in tmp1_path, tmp2_path, tmp3_path, tmp4_path:
Alex Martelli01c77c62006-08-24 02:58:11 +0000477 f = open(path, "w")
Tim Petersc4e09402003-04-25 07:11:48 +0000478 f.write("I'm " + path + " and proud of it. Blame test_os.\n")
479 f.close()
Brian Curtin3b4499c2010-12-28 14:31:47 +0000480 if support.can_symlink():
Antoine Pitrou5311c1d2012-01-24 08:59:28 +0100481 if os.name == 'nt':
482 def symlink_to_dir(src, dest):
483 os.symlink(src, dest, True)
484 else:
485 symlink_to_dir = os.symlink
486 symlink_to_dir(os.path.abspath(t2_path), link_path)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000487 sub2_tree = (sub2_path, ["link"], ["tmp3"])
488 else:
489 sub2_tree = (sub2_path, [], ["tmp3"])
Tim Petersc4e09402003-04-25 07:11:48 +0000490
491 # Walk top-down.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492 all = list(os.walk(walk_path))
Tim Petersc4e09402003-04-25 07:11:48 +0000493 self.assertEqual(len(all), 4)
494 # We can't know which order SUB1 and SUB2 will appear in.
495 # Not flipped: TESTFN, SUB1, SUB11, SUB2
496 # flipped: TESTFN, SUB2, SUB1, SUB11
497 flipped = all[0][1][0] != "SUB1"
498 all[0][1].sort()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000499 self.assertEqual(all[0], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
Tim Petersc4e09402003-04-25 07:11:48 +0000500 self.assertEqual(all[1 + flipped], (sub1_path, ["SUB11"], ["tmp2"]))
501 self.assertEqual(all[2 + flipped], (sub11_path, [], []))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000502 self.assertEqual(all[3 - 2 * flipped], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000503
504 # Prune the search.
505 all = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000506 for root, dirs, files in os.walk(walk_path):
Tim Petersc4e09402003-04-25 07:11:48 +0000507 all.append((root, dirs, files))
508 # Don't descend into SUB1.
509 if 'SUB1' in dirs:
510 # Note that this also mutates the dirs we appended to all!
511 dirs.remove('SUB1')
512 self.assertEqual(len(all), 2)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000513 self.assertEqual(all[0], (walk_path, ["SUB2"], ["tmp1"]))
514 self.assertEqual(all[1], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000515
516 # Walk bottom-up.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000517 all = list(os.walk(walk_path, topdown=False))
Tim Petersc4e09402003-04-25 07:11:48 +0000518 self.assertEqual(len(all), 4)
519 # We can't know which order SUB1 and SUB2 will appear in.
520 # Not flipped: SUB11, SUB1, SUB2, TESTFN
521 # flipped: SUB2, SUB11, SUB1, TESTFN
522 flipped = all[3][1][0] != "SUB1"
523 all[3][1].sort()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000524 self.assertEqual(all[3], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
Tim Petersc4e09402003-04-25 07:11:48 +0000525 self.assertEqual(all[flipped], (sub11_path, [], []))
526 self.assertEqual(all[flipped + 1], (sub1_path, ["SUB11"], ["tmp2"]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000527 self.assertEqual(all[2 - 2 * flipped], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000528
Brian Curtin3b4499c2010-12-28 14:31:47 +0000529 if support.can_symlink():
Guido van Rossumd8faa362007-04-27 19:54:29 +0000530 # Walk, following symlinks.
531 for root, dirs, files in os.walk(walk_path, followlinks=True):
532 if root == link_path:
533 self.assertEqual(dirs, [])
534 self.assertEqual(files, ["tmp4"])
535 break
536 else:
537 self.fail("Didn't follow symlink with followlinks=True")
538
539 def tearDown(self):
Tim Petersc4e09402003-04-25 07:11:48 +0000540 # Tear everything down. This is a decent use for bottom-up on
541 # Windows, which doesn't have a recursive delete command. The
542 # (not so) subtlety is that rmdir will fail unless the dir's
543 # kids are removed first, so bottom up is essential.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000544 for root, dirs, files in os.walk(support.TESTFN, topdown=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000545 for name in files:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546 os.remove(os.path.join(root, name))
Tim Petersc4e09402003-04-25 07:11:48 +0000547 for name in dirs:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000548 dirname = os.path.join(root, name)
549 if not os.path.islink(dirname):
550 os.rmdir(dirname)
551 else:
552 os.remove(dirname)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000553 os.rmdir(support.TESTFN)
Tim Petersc4e09402003-04-25 07:11:48 +0000554
Guido van Rossume7ba4952007-06-06 23:52:48 +0000555class MakedirTests(unittest.TestCase):
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000556 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000557 os.mkdir(support.TESTFN)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000558
559 def test_makedir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000560 base = support.TESTFN
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000561 path = os.path.join(base, 'dir1', 'dir2', 'dir3')
562 os.makedirs(path) # Should work
563 path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4')
564 os.makedirs(path)
565
566 # Try paths with a '.' in them
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000567 self.assertRaises(OSError, os.makedirs, os.curdir)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000568 path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4', 'dir5', os.curdir)
569 os.makedirs(path)
570 path = os.path.join(base, 'dir1', os.curdir, 'dir2', 'dir3', 'dir4',
571 'dir5', 'dir6')
572 os.makedirs(path)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000573
Terry Reedy5a22b652010-12-02 07:05:56 +0000574 def test_exist_ok_existing_directory(self):
575 path = os.path.join(support.TESTFN, 'dir1')
576 mode = 0o777
577 old_mask = os.umask(0o022)
Gregory P. Smitha81c8562012-06-03 14:30:44 -0700578 try:
579 os.makedirs(path, mode)
580 self.assertRaises(OSError, os.makedirs, path, mode)
581 self.assertRaises(OSError, os.makedirs, path, mode, exist_ok=False)
582 self.assertRaises(OSError, os.makedirs, path, 0o776, exist_ok=True)
583 os.makedirs(path, mode=mode, exist_ok=True)
584 finally:
585 os.umask(old_mask)
586
587 def test_exist_ok_s_isgid_directory(self):
588 path = os.path.join(support.TESTFN, 'dir1')
589 S_ISGID = stat.S_ISGID
590 mode = 0o777
591 old_mask = os.umask(0o022)
592 try:
593 existing_testfn_mode = stat.S_IMODE(
594 os.lstat(support.TESTFN).st_mode)
595 os.chmod(support.TESTFN, existing_testfn_mode | S_ISGID)
596 if (os.lstat(support.TESTFN).st_mode & S_ISGID != S_ISGID):
597 raise unittest.SkipTest('No support for S_ISGID dir mode.')
598 # The os should apply S_ISGID from the parent dir for us, but
599 # this test need not depend on that behavior. Be explicit.
600 os.makedirs(path, mode | S_ISGID)
601 # http://bugs.python.org/issue14992
602 # Should not fail when the bit is already set.
603 os.makedirs(path, mode, exist_ok=True)
604 # remove the bit.
605 os.chmod(path, stat.S_IMODE(os.lstat(path).st_mode) & ~S_ISGID)
606 with self.assertRaises(OSError):
607 # Should fail when the bit is not already set when demanded.
608 os.makedirs(path, mode | S_ISGID, exist_ok=True)
609 finally:
610 os.umask(old_mask)
Terry Reedy5a22b652010-12-02 07:05:56 +0000611
612 def test_exist_ok_existing_regular_file(self):
613 base = support.TESTFN
614 path = os.path.join(support.TESTFN, 'dir1')
615 f = open(path, 'w')
616 f.write('abc')
617 f.close()
618 self.assertRaises(OSError, os.makedirs, path)
619 self.assertRaises(OSError, os.makedirs, path, exist_ok=False)
620 self.assertRaises(OSError, os.makedirs, path, exist_ok=True)
621 os.remove(path)
622
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000623 def tearDown(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000624 path = os.path.join(support.TESTFN, 'dir1', 'dir2', 'dir3',
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000625 'dir4', 'dir5', 'dir6')
626 # If the tests failed, the bottom-most directory ('../dir6')
627 # may not have been created, so we look for the outermost directory
628 # that exists.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000629 while not os.path.exists(path) and path != support.TESTFN:
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000630 path = os.path.dirname(path)
631
632 os.removedirs(path)
633
Guido van Rossume7ba4952007-06-06 23:52:48 +0000634class DevNullTests(unittest.TestCase):
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000635 def test_devnull(self):
Victor Stinnera6d2c762011-06-30 18:20:11 +0200636 with open(os.devnull, 'wb') as f:
637 f.write(b'hello')
638 f.close()
639 with open(os.devnull, 'rb') as f:
640 self.assertEqual(f.read(), b'')
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000641
Guido van Rossume7ba4952007-06-06 23:52:48 +0000642class URandomTests(unittest.TestCase):
Georg Brandl2daf6ae2012-02-20 19:54:16 +0100643 def test_urandom_length(self):
644 self.assertEqual(len(os.urandom(0)), 0)
645 self.assertEqual(len(os.urandom(1)), 1)
646 self.assertEqual(len(os.urandom(10)), 10)
647 self.assertEqual(len(os.urandom(100)), 100)
648 self.assertEqual(len(os.urandom(1000)), 1000)
649
650 def test_urandom_value(self):
651 data1 = os.urandom(16)
652 data2 = os.urandom(16)
653 self.assertNotEqual(data1, data2)
654
655 def get_urandom_subprocess(self, count):
656 code = '\n'.join((
657 'import os, sys',
658 'data = os.urandom(%s)' % count,
659 'sys.stdout.buffer.write(data)',
660 'sys.stdout.buffer.flush()'))
661 out = assert_python_ok('-c', code)
662 stdout = out[1]
663 self.assertEqual(len(stdout), 16)
664 return stdout
665
666 def test_urandom_subprocess(self):
667 data1 = self.get_urandom_subprocess(16)
668 data2 = self.get_urandom_subprocess(16)
669 self.assertNotEqual(data1, data2)
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000670
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000671@contextlib.contextmanager
672def _execvpe_mockup(defpath=None):
673 """
674 Stubs out execv and execve functions when used as context manager.
675 Records exec calls. The mock execv and execve functions always raise an
676 exception as they would normally never return.
677 """
678 # A list of tuples containing (function name, first arg, args)
679 # of calls to execv or execve that have been made.
680 calls = []
681
682 def mock_execv(name, *args):
683 calls.append(('execv', name, args))
684 raise RuntimeError("execv called")
685
686 def mock_execve(name, *args):
687 calls.append(('execve', name, args))
688 raise OSError(errno.ENOTDIR, "execve called")
689
690 try:
691 orig_execv = os.execv
692 orig_execve = os.execve
693 orig_defpath = os.defpath
694 os.execv = mock_execv
695 os.execve = mock_execve
696 if defpath is not None:
697 os.defpath = defpath
698 yield calls
699 finally:
700 os.execv = orig_execv
701 os.execve = orig_execve
702 os.defpath = orig_defpath
703
Guido van Rossume7ba4952007-06-06 23:52:48 +0000704class ExecTests(unittest.TestCase):
Mark Dickinson7cf03892010-04-16 13:45:35 +0000705 @unittest.skipIf(USING_LINUXTHREADS,
706 "avoid triggering a linuxthreads bug: see issue #4970")
Guido van Rossume7ba4952007-06-06 23:52:48 +0000707 def test_execvpe_with_bad_program(self):
Mark Dickinson7cf03892010-04-16 13:45:35 +0000708 self.assertRaises(OSError, os.execvpe, 'no such app-',
709 ['no such app-'], None)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000710
Thomas Heller6790d602007-08-30 17:15:14 +0000711 def test_execvpe_with_bad_arglist(self):
712 self.assertRaises(ValueError, os.execvpe, 'notepad', [], None)
713
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000714 @unittest.skipUnless(hasattr(os, '_execvpe'),
715 "No internal os._execvpe function to test.")
Victor Stinnerb745a742010-05-18 17:17:23 +0000716 def _test_internal_execvpe(self, test_type):
717 program_path = os.sep + 'absolutepath'
718 if test_type is bytes:
719 program = b'executable'
720 fullpath = os.path.join(os.fsencode(program_path), program)
721 native_fullpath = fullpath
722 arguments = [b'progname', 'arg1', 'arg2']
723 else:
724 program = 'executable'
725 arguments = ['progname', 'arg1', 'arg2']
726 fullpath = os.path.join(program_path, program)
727 if os.name != "nt":
728 native_fullpath = os.fsencode(fullpath)
729 else:
730 native_fullpath = fullpath
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000731 env = {'spam': 'beans'}
732
Victor Stinnerb745a742010-05-18 17:17:23 +0000733 # test os._execvpe() with an absolute path
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000734 with _execvpe_mockup() as calls:
Victor Stinnerb745a742010-05-18 17:17:23 +0000735 self.assertRaises(RuntimeError,
736 os._execvpe, fullpath, arguments)
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000737 self.assertEqual(len(calls), 1)
738 self.assertEqual(calls[0], ('execv', fullpath, (arguments,)))
739
Victor Stinnerb745a742010-05-18 17:17:23 +0000740 # test os._execvpe() with a relative path:
741 # os.get_exec_path() returns defpath
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000742 with _execvpe_mockup(defpath=program_path) as calls:
Victor Stinnerb745a742010-05-18 17:17:23 +0000743 self.assertRaises(OSError,
744 os._execvpe, program, arguments, env=env)
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000745 self.assertEqual(len(calls), 1)
Victor Stinnerb745a742010-05-18 17:17:23 +0000746 self.assertSequenceEqual(calls[0],
747 ('execve', native_fullpath, (arguments, env)))
748
749 # test os._execvpe() with a relative path:
750 # os.get_exec_path() reads the 'PATH' variable
751 with _execvpe_mockup() as calls:
752 env_path = env.copy()
Victor Stinner38430e22010-08-19 17:10:18 +0000753 if test_type is bytes:
754 env_path[b'PATH'] = program_path
755 else:
756 env_path['PATH'] = program_path
Victor Stinnerb745a742010-05-18 17:17:23 +0000757 self.assertRaises(OSError,
758 os._execvpe, program, arguments, env=env_path)
759 self.assertEqual(len(calls), 1)
760 self.assertSequenceEqual(calls[0],
761 ('execve', native_fullpath, (arguments, env_path)))
762
763 def test_internal_execvpe_str(self):
764 self._test_internal_execvpe(str)
765 if os.name != "nt":
766 self._test_internal_execvpe(bytes)
Victor Stinnerc2d095f2010-05-17 00:14:53 +0000767
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000768
Thomas Wouters477c8d52006-05-27 19:21:47 +0000769class Win32ErrorTests(unittest.TestCase):
770 def test_rename(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000771 self.assertRaises(WindowsError, os.rename, support.TESTFN, support.TESTFN+".bak")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000772
773 def test_remove(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000774 self.assertRaises(WindowsError, os.remove, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000775
776 def test_chdir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000777 self.assertRaises(WindowsError, os.chdir, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000778
779 def test_mkdir(self):
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000780 f = open(support.TESTFN, "w")
Benjamin Petersonf91df042009-02-13 02:50:59 +0000781 try:
782 self.assertRaises(WindowsError, os.mkdir, support.TESTFN)
783 finally:
784 f.close()
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000785 os.unlink(support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000786
787 def test_utime(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000788 self.assertRaises(WindowsError, os.utime, support.TESTFN, None)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000789
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790 def test_chmod(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000791 self.assertRaises(WindowsError, os.chmod, support.TESTFN, 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000792
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000793class TestInvalidFD(unittest.TestCase):
Benjamin Peterson05e782f2009-01-19 15:15:02 +0000794 singles = ["fchdir", "dup", "fdopen", "fdatasync", "fstat",
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000795 "fstatvfs", "fsync", "tcgetpgrp", "ttyname"]
796 #singles.append("close")
797 #We omit close because it doesn'r raise an exception on some platforms
798 def get_single(f):
799 def helper(self):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000800 if hasattr(os, f):
801 self.check(getattr(os, f))
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000802 return helper
803 for f in singles:
804 locals()["test_"+f] = get_single(f)
805
Benjamin Peterson7522c742009-01-19 21:00:09 +0000806 def check(self, f, *args):
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000807 try:
808 f(support.make_bad_fd(), *args)
809 except OSError as e:
810 self.assertEqual(e.errno, errno.EBADF)
811 else:
812 self.fail("%r didn't raise a OSError with a bad file descriptor"
813 % f)
Benjamin Peterson7522c742009-01-19 21:00:09 +0000814
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000815 def test_isatty(self):
816 if hasattr(os, "isatty"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000817 self.assertEqual(os.isatty(support.make_bad_fd()), False)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000818
819 def test_closerange(self):
820 if hasattr(os, "closerange"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000821 fd = support.make_bad_fd()
R. David Murray630cc482009-07-22 15:20:27 +0000822 # Make sure none of the descriptors we are about to close are
823 # currently valid (issue 6542).
824 for i in range(10):
825 try: os.fstat(fd+i)
826 except OSError:
827 pass
828 else:
829 break
830 if i < 2:
831 raise unittest.SkipTest(
832 "Unable to acquire a range of invalid file descriptors")
833 self.assertEqual(os.closerange(fd, fd + i-1), None)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000834
835 def test_dup2(self):
836 if hasattr(os, "dup2"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000837 self.check(os.dup2, 20)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000838
839 def test_fchmod(self):
840 if hasattr(os, "fchmod"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000841 self.check(os.fchmod, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000842
843 def test_fchown(self):
844 if hasattr(os, "fchown"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000845 self.check(os.fchown, -1, -1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000846
847 def test_fpathconf(self):
848 if hasattr(os, "fpathconf"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000849 self.check(os.fpathconf, "PC_NAME_MAX")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000850
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000851 def test_ftruncate(self):
852 if hasattr(os, "ftruncate"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000853 self.check(os.ftruncate, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000854
855 def test_lseek(self):
856 if hasattr(os, "lseek"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000857 self.check(os.lseek, 0, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000858
859 def test_read(self):
860 if hasattr(os, "read"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000861 self.check(os.read, 1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000862
863 def test_tcsetpgrpt(self):
864 if hasattr(os, "tcsetpgrp"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000865 self.check(os.tcsetpgrp, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000866
867 def test_write(self):
868 if hasattr(os, "write"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000869 self.check(os.write, b" ")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000870
Brian Curtin1b9df392010-11-24 20:24:31 +0000871
872class LinkTests(unittest.TestCase):
873 def setUp(self):
874 self.file1 = support.TESTFN
875 self.file2 = os.path.join(support.TESTFN + "2")
876
Brian Curtinc0abc4e2010-11-30 23:46:54 +0000877 def tearDown(self):
Brian Curtin1b9df392010-11-24 20:24:31 +0000878 for file in (self.file1, self.file2):
879 if os.path.exists(file):
880 os.unlink(file)
881
Brian Curtin1b9df392010-11-24 20:24:31 +0000882 def _test_link(self, file1, file2):
883 with open(file1, "w") as f1:
884 f1.write("test")
885
886 os.link(file1, file2)
887 with open(file1, "r") as f1, open(file2, "r") as f2:
888 self.assertTrue(os.path.sameopenfile(f1.fileno(), f2.fileno()))
889
890 def test_link(self):
891 self._test_link(self.file1, self.file2)
892
893 def test_link_bytes(self):
894 self._test_link(bytes(self.file1, sys.getfilesystemencoding()),
895 bytes(self.file2, sys.getfilesystemencoding()))
896
Brian Curtinf498b752010-11-30 15:54:04 +0000897 def test_unicode_name(self):
Brian Curtin43f0c272010-11-30 15:40:04 +0000898 try:
Brian Curtinf498b752010-11-30 15:54:04 +0000899 os.fsencode("\xf1")
Brian Curtin43f0c272010-11-30 15:40:04 +0000900 except UnicodeError:
901 raise unittest.SkipTest("Unable to encode for this platform.")
902
Brian Curtinf498b752010-11-30 15:54:04 +0000903 self.file1 += "\xf1"
Brian Curtinfc889c42010-11-28 23:59:46 +0000904 self.file2 = self.file1 + "2"
905 self._test_link(self.file1, self.file2)
906
Thomas Wouters477c8d52006-05-27 19:21:47 +0000907if sys.platform != 'win32':
908 class Win32ErrorTests(unittest.TestCase):
909 pass
910
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000911 class PosixUidGidTests(unittest.TestCase):
912 if hasattr(os, 'setuid'):
913 def test_setuid(self):
914 if os.getuid() != 0:
915 self.assertRaises(os.error, os.setuid, 0)
916 self.assertRaises(OverflowError, os.setuid, 1<<32)
917
918 if hasattr(os, 'setgid'):
919 def test_setgid(self):
920 if os.getuid() != 0:
921 self.assertRaises(os.error, os.setgid, 0)
922 self.assertRaises(OverflowError, os.setgid, 1<<32)
923
924 if hasattr(os, 'seteuid'):
925 def test_seteuid(self):
926 if os.getuid() != 0:
927 self.assertRaises(os.error, os.seteuid, 0)
928 self.assertRaises(OverflowError, os.seteuid, 1<<32)
929
930 if hasattr(os, 'setegid'):
931 def test_setegid(self):
932 if os.getuid() != 0:
933 self.assertRaises(os.error, os.setegid, 0)
934 self.assertRaises(OverflowError, os.setegid, 1<<32)
935
936 if hasattr(os, 'setreuid'):
937 def test_setreuid(self):
938 if os.getuid() != 0:
939 self.assertRaises(os.error, os.setreuid, 0, 0)
940 self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
941 self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000942
943 def test_setreuid_neg1(self):
944 # Needs to accept -1. We run this in a subprocess to avoid
945 # altering the test runner's process state (issue8045).
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000946 subprocess.check_call([
947 sys.executable, '-c',
948 'import os,sys;os.setreuid(-1,-1);sys.exit(0)'])
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000949
950 if hasattr(os, 'setregid'):
951 def test_setregid(self):
952 if os.getuid() != 0:
953 self.assertRaises(os.error, os.setregid, 0, 0)
954 self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
955 self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000956
957 def test_setregid_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.setregid(-1,-1);sys.exit(0)'])
Martin v. Löwis011e8422009-05-05 04:43:17 +0000963
964 class Pep383Tests(unittest.TestCase):
Martin v. Löwis011e8422009-05-05 04:43:17 +0000965 def setUp(self):
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000966 if support.TESTFN_UNENCODABLE:
967 self.dir = support.TESTFN_UNENCODABLE
968 else:
969 self.dir = support.TESTFN
970 self.bdir = os.fsencode(self.dir)
971
972 bytesfn = []
973 def add_filename(fn):
974 try:
975 fn = os.fsencode(fn)
976 except UnicodeEncodeError:
977 return
978 bytesfn.append(fn)
979 add_filename(support.TESTFN_UNICODE)
980 if support.TESTFN_UNENCODABLE:
981 add_filename(support.TESTFN_UNENCODABLE)
982 if not bytesfn:
983 self.skipTest("couldn't create any non-ascii filename")
984
985 self.unicodefn = set()
Martin v. Löwis011e8422009-05-05 04:43:17 +0000986 os.mkdir(self.dir)
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000987 try:
988 for fn in bytesfn:
989 f = open(os.path.join(self.bdir, fn), "w")
990 f.close()
Victor Stinnere8d51452010-08-19 01:05:19 +0000991 fn = os.fsdecode(fn)
Victor Stinnerd91df1a2010-08-18 10:56:19 +0000992 if fn in self.unicodefn:
993 raise ValueError("duplicate filename")
994 self.unicodefn.add(fn)
995 except:
996 shutil.rmtree(self.dir)
997 raise
Martin v. Löwis011e8422009-05-05 04:43:17 +0000998
999 def tearDown(self):
1000 shutil.rmtree(self.dir)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001001
1002 def test_listdir(self):
Victor Stinnerd91df1a2010-08-18 10:56:19 +00001003 expected = self.unicodefn
1004 found = set(os.listdir(self.dir))
Ezio Melottib3aedd42010-11-20 19:04:17 +00001005 self.assertEqual(found, expected)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001006
1007 def test_open(self):
1008 for fn in self.unicodefn:
Victor Stinnera6d2c762011-06-30 18:20:11 +02001009 f = open(os.path.join(self.dir, fn), 'rb')
Martin v. Löwis011e8422009-05-05 04:43:17 +00001010 f.close()
1011
1012 def test_stat(self):
1013 for fn in self.unicodefn:
1014 os.stat(os.path.join(self.dir, fn))
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001015else:
1016 class PosixUidGidTests(unittest.TestCase):
1017 pass
Martin v. Löwis011e8422009-05-05 04:43:17 +00001018 class Pep383Tests(unittest.TestCase):
1019 pass
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001020
Brian Curtineb24d742010-04-12 17:16:38 +00001021@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
1022class Win32KillTests(unittest.TestCase):
Brian Curtinc3acbc32010-05-28 16:08:40 +00001023 def _kill(self, sig):
1024 # Start sys.executable as a subprocess and communicate from the
1025 # subprocess to the parent that the interpreter is ready. When it
1026 # becomes ready, send *sig* via os.kill to the subprocess and check
1027 # that the return code is equal to *sig*.
1028 import ctypes
1029 from ctypes import wintypes
1030 import msvcrt
1031
1032 # Since we can't access the contents of the process' stdout until the
1033 # process has exited, use PeekNamedPipe to see what's inside stdout
1034 # without waiting. This is done so we can tell that the interpreter
1035 # is started and running at a point where it could handle a signal.
1036 PeekNamedPipe = ctypes.windll.kernel32.PeekNamedPipe
1037 PeekNamedPipe.restype = wintypes.BOOL
1038 PeekNamedPipe.argtypes = (wintypes.HANDLE, # Pipe handle
1039 ctypes.POINTER(ctypes.c_char), # stdout buf
1040 wintypes.DWORD, # Buffer size
1041 ctypes.POINTER(wintypes.DWORD), # bytes read
1042 ctypes.POINTER(wintypes.DWORD), # bytes avail
1043 ctypes.POINTER(wintypes.DWORD)) # bytes left
1044 msg = "running"
1045 proc = subprocess.Popen([sys.executable, "-c",
1046 "import sys;"
1047 "sys.stdout.write('{}');"
1048 "sys.stdout.flush();"
1049 "input()".format(msg)],
1050 stdout=subprocess.PIPE,
1051 stderr=subprocess.PIPE,
1052 stdin=subprocess.PIPE)
Brian Curtin43ec5772010-11-05 15:17:11 +00001053 self.addCleanup(proc.stdout.close)
1054 self.addCleanup(proc.stderr.close)
1055 self.addCleanup(proc.stdin.close)
Brian Curtinc3acbc32010-05-28 16:08:40 +00001056
1057 count, max = 0, 100
1058 while count < max and proc.poll() is None:
1059 # Create a string buffer to store the result of stdout from the pipe
1060 buf = ctypes.create_string_buffer(len(msg))
1061 # Obtain the text currently in proc.stdout
1062 # Bytes read/avail/left are left as NULL and unused
1063 rslt = PeekNamedPipe(msvcrt.get_osfhandle(proc.stdout.fileno()),
1064 buf, ctypes.sizeof(buf), None, None, None)
1065 self.assertNotEqual(rslt, 0, "PeekNamedPipe failed")
1066 if buf.value:
1067 self.assertEqual(msg, buf.value.decode())
1068 break
1069 time.sleep(0.1)
1070 count += 1
1071 else:
1072 self.fail("Did not receive communication from the subprocess")
1073
Brian Curtineb24d742010-04-12 17:16:38 +00001074 os.kill(proc.pid, sig)
1075 self.assertEqual(proc.wait(), sig)
1076
1077 def test_kill_sigterm(self):
1078 # SIGTERM doesn't mean anything special, but make sure it works
Brian Curtinc3acbc32010-05-28 16:08:40 +00001079 self._kill(signal.SIGTERM)
Brian Curtineb24d742010-04-12 17:16:38 +00001080
1081 def test_kill_int(self):
1082 # os.kill on Windows can take an int which gets set as the exit code
Brian Curtinc3acbc32010-05-28 16:08:40 +00001083 self._kill(100)
Brian Curtineb24d742010-04-12 17:16:38 +00001084
1085 def _kill_with_event(self, event, name):
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001086 tagname = "test_os_%s" % uuid.uuid1()
1087 m = mmap.mmap(-1, 1, tagname)
1088 m[0] = 0
Brian Curtineb24d742010-04-12 17:16:38 +00001089 # Run a script which has console control handling enabled.
1090 proc = subprocess.Popen([sys.executable,
1091 os.path.join(os.path.dirname(__file__),
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001092 "win_console_handler.py"), tagname],
Brian Curtineb24d742010-04-12 17:16:38 +00001093 creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
1094 # Let the interpreter startup before we send signals. See #3137.
Hirokazu Yamamoto8e9fe9f2010-12-05 02:41:46 +00001095 count, max = 0, 100
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001096 while count < max and proc.poll() is None:
Brian Curtinf668df52010-10-15 14:21:06 +00001097 if m[0] == 1:
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001098 break
Hirokazu Yamamoto8e9fe9f2010-12-05 02:41:46 +00001099 time.sleep(0.1)
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001100 count += 1
1101 else:
Hirokazu Yamamoto8e9fe9f2010-12-05 02:41:46 +00001102 # Forcefully kill the process if we weren't able to signal it.
1103 os.kill(proc.pid, signal.SIGINT)
Hirokazu Yamamoto54c950f2010-10-08 08:38:15 +00001104 self.fail("Subprocess didn't finish initialization")
Brian Curtineb24d742010-04-12 17:16:38 +00001105 os.kill(proc.pid, event)
1106 # proc.send_signal(event) could also be done here.
1107 # Allow time for the signal to be passed and the process to exit.
1108 time.sleep(0.5)
1109 if not proc.poll():
1110 # Forcefully kill the process if we weren't able to signal it.
1111 os.kill(proc.pid, signal.SIGINT)
1112 self.fail("subprocess did not stop on {}".format(name))
1113
1114 @unittest.skip("subprocesses aren't inheriting CTRL+C property")
1115 def test_CTRL_C_EVENT(self):
1116 from ctypes import wintypes
1117 import ctypes
1118
1119 # Make a NULL value by creating a pointer with no argument.
1120 NULL = ctypes.POINTER(ctypes.c_int)()
1121 SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
1122 SetConsoleCtrlHandler.argtypes = (ctypes.POINTER(ctypes.c_int),
1123 wintypes.BOOL)
1124 SetConsoleCtrlHandler.restype = wintypes.BOOL
1125
1126 # Calling this with NULL and FALSE causes the calling process to
1127 # handle CTRL+C, rather than ignore it. This property is inherited
1128 # by subprocesses.
1129 SetConsoleCtrlHandler(NULL, 0)
1130
1131 self._kill_with_event(signal.CTRL_C_EVENT, "CTRL_C_EVENT")
1132
1133 def test_CTRL_BREAK_EVENT(self):
1134 self._kill_with_event(signal.CTRL_BREAK_EVENT, "CTRL_BREAK_EVENT")
1135
1136
Brian Curtind40e6f72010-07-08 21:39:08 +00001137@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
Brian Curtin3b4499c2010-12-28 14:31:47 +00001138@support.skip_unless_symlink
Brian Curtind40e6f72010-07-08 21:39:08 +00001139class Win32SymlinkTests(unittest.TestCase):
1140 filelink = 'filelinktest'
1141 filelink_target = os.path.abspath(__file__)
1142 dirlink = 'dirlinktest'
1143 dirlink_target = os.path.dirname(filelink_target)
1144 missing_link = 'missing link'
1145
1146 def setUp(self):
1147 assert os.path.exists(self.dirlink_target)
1148 assert os.path.exists(self.filelink_target)
1149 assert not os.path.exists(self.dirlink)
1150 assert not os.path.exists(self.filelink)
1151 assert not os.path.exists(self.missing_link)
1152
1153 def tearDown(self):
1154 if os.path.exists(self.filelink):
1155 os.remove(self.filelink)
1156 if os.path.exists(self.dirlink):
1157 os.rmdir(self.dirlink)
1158 if os.path.lexists(self.missing_link):
1159 os.remove(self.missing_link)
1160
1161 def test_directory_link(self):
Antoine Pitrou5311c1d2012-01-24 08:59:28 +01001162 os.symlink(self.dirlink_target, self.dirlink, True)
Brian Curtind40e6f72010-07-08 21:39:08 +00001163 self.assertTrue(os.path.exists(self.dirlink))
1164 self.assertTrue(os.path.isdir(self.dirlink))
1165 self.assertTrue(os.path.islink(self.dirlink))
1166 self.check_stat(self.dirlink, self.dirlink_target)
1167
1168 def test_file_link(self):
1169 os.symlink(self.filelink_target, self.filelink)
1170 self.assertTrue(os.path.exists(self.filelink))
1171 self.assertTrue(os.path.isfile(self.filelink))
1172 self.assertTrue(os.path.islink(self.filelink))
1173 self.check_stat(self.filelink, self.filelink_target)
1174
1175 def _create_missing_dir_link(self):
1176 'Create a "directory" link to a non-existent target'
1177 linkname = self.missing_link
1178 if os.path.lexists(linkname):
1179 os.remove(linkname)
1180 target = r'c:\\target does not exist.29r3c740'
1181 assert not os.path.exists(target)
1182 target_is_dir = True
1183 os.symlink(target, linkname, target_is_dir)
1184
1185 def test_remove_directory_link_to_missing_target(self):
1186 self._create_missing_dir_link()
1187 # For compatibility with Unix, os.remove will check the
1188 # directory status and call RemoveDirectory if the symlink
1189 # was created with target_is_dir==True.
1190 os.remove(self.missing_link)
1191
1192 @unittest.skip("currently fails; consider for improvement")
1193 def test_isdir_on_directory_link_to_missing_target(self):
1194 self._create_missing_dir_link()
1195 # consider having isdir return true for directory links
1196 self.assertTrue(os.path.isdir(self.missing_link))
1197
1198 @unittest.skip("currently fails; consider for improvement")
1199 def test_rmdir_on_directory_link_to_missing_target(self):
1200 self._create_missing_dir_link()
1201 # consider allowing rmdir to remove directory links
1202 os.rmdir(self.missing_link)
1203
1204 def check_stat(self, link, target):
1205 self.assertEqual(os.stat(link), os.stat(target))
1206 self.assertNotEqual(os.lstat(link), os.stat(link))
1207
Brian Curtind25aef52011-06-13 15:16:04 -05001208 bytes_link = os.fsencode(link)
1209 self.assertEqual(os.stat(bytes_link), os.stat(target))
1210 self.assertNotEqual(os.lstat(bytes_link), os.stat(bytes_link))
1211
1212 def test_12084(self):
1213 level1 = os.path.abspath(support.TESTFN)
1214 level2 = os.path.join(level1, "level2")
1215 level3 = os.path.join(level2, "level3")
1216 try:
1217 os.mkdir(level1)
1218 os.mkdir(level2)
1219 os.mkdir(level3)
1220
1221 file1 = os.path.abspath(os.path.join(level1, "file1"))
1222
1223 with open(file1, "w") as f:
1224 f.write("file1")
1225
1226 orig_dir = os.getcwd()
1227 try:
1228 os.chdir(level2)
1229 link = os.path.join(level2, "link")
1230 os.symlink(os.path.relpath(file1), "link")
1231 self.assertIn("link", os.listdir(os.getcwd()))
1232
1233 # Check os.stat calls from the same dir as the link
1234 self.assertEqual(os.stat(file1), os.stat("link"))
1235
1236 # Check os.stat calls from a dir below the link
1237 os.chdir(level1)
1238 self.assertEqual(os.stat(file1),
1239 os.stat(os.path.relpath(link)))
1240
1241 # Check os.stat calls from a dir above the link
1242 os.chdir(level3)
1243 self.assertEqual(os.stat(file1),
1244 os.stat(os.path.relpath(link)))
1245 finally:
1246 os.chdir(orig_dir)
1247 except OSError as err:
1248 self.fail(err)
1249 finally:
1250 os.remove(file1)
1251 shutil.rmtree(level1)
1252
Brian Curtind40e6f72010-07-08 21:39:08 +00001253
Victor Stinnere8d51452010-08-19 01:05:19 +00001254class FSEncodingTests(unittest.TestCase):
1255 def test_nop(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +00001256 self.assertEqual(os.fsencode(b'abc\xff'), b'abc\xff')
1257 self.assertEqual(os.fsdecode('abc\u0141'), 'abc\u0141')
Benjamin Peterson31191a92010-05-09 03:22:58 +00001258
Victor Stinnere8d51452010-08-19 01:05:19 +00001259 def test_identity(self):
1260 # assert fsdecode(fsencode(x)) == x
1261 for fn in ('unicode\u0141', 'latin\xe9', 'ascii'):
1262 try:
1263 bytesfn = os.fsencode(fn)
1264 except UnicodeEncodeError:
1265 continue
Ezio Melottib3aedd42010-11-20 19:04:17 +00001266 self.assertEqual(os.fsdecode(bytesfn), fn)
Victor Stinnere8d51452010-08-19 01:05:19 +00001267
Victor Stinnerbf9bcab2010-05-09 03:15:33 +00001268
Amaury Forgeot d'Arc4b6fdf32010-09-07 21:31:17 +00001269class PidTests(unittest.TestCase):
1270 @unittest.skipUnless(hasattr(os, 'getppid'), "test needs os.getppid")
1271 def test_getppid(self):
1272 p = subprocess.Popen([sys.executable, '-c',
1273 'import os; print(os.getppid())'],
1274 stdout=subprocess.PIPE)
1275 stdout, _ = p.communicate()
1276 # We are the parent of our subprocess
1277 self.assertEqual(int(stdout), os.getpid())
1278
1279
Brian Curtin0151b8e2010-09-24 13:43:43 +00001280# The introduction of this TestCase caused at least two different errors on
1281# *nix buildbots. Temporarily skip this to let the buildbots move along.
1282@unittest.skip("Skip due to platform/environment differences on *NIX buildbots")
Brian Curtine8e4b3b2010-09-23 20:04:14 +00001283@unittest.skipUnless(hasattr(os, 'getlogin'), "test needs os.getlogin")
1284class LoginTests(unittest.TestCase):
1285 def test_getlogin(self):
1286 user_name = os.getlogin()
1287 self.assertNotEqual(len(user_name), 0)
1288
1289
Fred Drake2e2be372001-09-20 21:33:42 +00001290def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001291 support.run_unittest(
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001292 FileTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001293 StatAttributeTests,
1294 EnvironTests,
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +00001295 WalkTests,
1296 MakedirTests,
Martin v. Löwisbdec50f2004-06-08 08:29:33 +00001297 DevNullTests,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001298 URandomTests,
Guido van Rossume7ba4952007-06-06 23:52:48 +00001299 ExecTests,
Benjamin Petersone1cdfd72009-01-18 21:02:37 +00001300 Win32ErrorTests,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00001301 TestInvalidFD,
Martin v. Löwis011e8422009-05-05 04:43:17 +00001302 PosixUidGidTests,
Brian Curtineb24d742010-04-12 17:16:38 +00001303 Pep383Tests,
Victor Stinnerbf9bcab2010-05-09 03:15:33 +00001304 Win32KillTests,
Brian Curtind40e6f72010-07-08 21:39:08 +00001305 Win32SymlinkTests,
Victor Stinnere8d51452010-08-19 01:05:19 +00001306 FSEncodingTests,
Amaury Forgeot d'Arc4b6fdf32010-09-07 21:31:17 +00001307 PidTests,
Brian Curtine8e4b3b2010-09-23 20:04:14 +00001308 LoginTests,
Brian Curtin1b9df392010-11-24 20:24:31 +00001309 LinkTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +00001310 )
Fred Drake2e2be372001-09-20 21:33:42 +00001311
1312if __name__ == "__main__":
1313 test_main()