blob: 3e958f2e991f8465f98dfe65455d163ee2cfc707 [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
Fred Drake38c2ef02001-07-17 20:52:51 +000015
Mark Dickinson7cf03892010-04-16 13:45:35 +000016# Detect whether we're on a Linux system that uses the (now outdated
17# and unmaintained) linuxthreads threading library. There's an issue
18# when combining linuxthreads with a failed execv call: see
19# http://bugs.python.org/issue4970.
Mark Dickinson89589c92010-04-16 13:51:27 +000020if (hasattr(os, "confstr_names") and
21 "CS_GNU_LIBPTHREAD_VERSION" in os.confstr_names):
Mark Dickinson7cf03892010-04-16 13:45:35 +000022 libpthread = os.confstr("CS_GNU_LIBPTHREAD_VERSION")
23 USING_LINUXTHREADS= libpthread.startswith("linuxthreads")
24else:
25 USING_LINUXTHREADS= False
Brian Curtineb24d742010-04-12 17:16:38 +000026
Thomas Wouters0e3f5912006-08-11 14:57:12 +000027# Tests creating TESTFN
28class FileTests(unittest.TestCase):
29 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000030 if os.path.exists(support.TESTFN):
31 os.unlink(support.TESTFN)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000032 tearDown = setUp
33
34 def test_access(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +000035 f = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR)
Thomas Wouters0e3f5912006-08-11 14:57:12 +000036 os.close(f)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000037 self.assertTrue(os.access(support.TESTFN, os.W_OK))
Thomas Wouters0e3f5912006-08-11 14:57:12 +000038
Christian Heimesfdab48e2008-01-20 09:06:41 +000039 def test_closerange(self):
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000040 first = os.open(support.TESTFN, os.O_CREAT|os.O_RDWR)
41 # We must allocate two consecutive file descriptors, otherwise
42 # it will mess up other file descriptors (perhaps even the three
43 # standard ones).
44 second = os.dup(first)
45 try:
46 retries = 0
47 while second != first + 1:
48 os.close(first)
49 retries += 1
50 if retries > 10:
51 # XXX test skipped
Benjamin Petersonfa0d7032009-06-01 22:42:33 +000052 self.skipTest("couldn't allocate two consecutive fds")
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000053 first, second = second, os.dup(second)
54 finally:
55 os.close(second)
Christian Heimesfdab48e2008-01-20 09:06:41 +000056 # close a fd that is open, and one that isn't
Antoine Pitroub9ee06c2008-08-16 22:03:17 +000057 os.closerange(first, first + 2)
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000058 self.assertRaises(OSError, os.write, first, b"a")
Thomas Wouters0e3f5912006-08-11 14:57:12 +000059
Hirokazu Yamamoto4c19e6e2008-09-08 23:41:21 +000060 def test_rename(self):
61 path = support.TESTFN
62 old = sys.getrefcount(path)
63 self.assertRaises(TypeError, os.rename, path, 0)
64 new = sys.getrefcount(path)
65 self.assertEqual(old, new)
66
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000067 def test_read(self):
68 with open(support.TESTFN, "w+b") as fobj:
69 fobj.write(b"spam")
70 fobj.flush()
71 fd = fobj.fileno()
72 os.lseek(fd, 0, 0)
73 s = os.read(fd, 4)
74 self.assertEqual(type(s), bytes)
75 self.assertEqual(s, b"spam")
76
77 def test_write(self):
78 # os.write() accepts bytes- and buffer-like objects but not strings
79 fd = os.open(support.TESTFN, os.O_CREAT | os.O_WRONLY)
80 self.assertRaises(TypeError, os.write, fd, "beans")
81 os.write(fd, b"bacon\n")
82 os.write(fd, bytearray(b"eggs\n"))
83 os.write(fd, memoryview(b"spam\n"))
84 os.close(fd)
85 with open(support.TESTFN, "rb") as fobj:
Antoine Pitroud62269f2008-09-15 23:54:52 +000086 self.assertEqual(fobj.read().splitlines(),
87 [b"bacon", b"eggs", b"spam"])
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +000088
89
Christian Heimesdd15f6c2008-03-16 00:07:10 +000090class TemporaryFileTests(unittest.TestCase):
91 def setUp(self):
92 self.files = []
Benjamin Petersonee8712c2008-05-20 21:35:26 +000093 os.mkdir(support.TESTFN)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000094
95 def tearDown(self):
96 for name in self.files:
97 os.unlink(name)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000098 os.rmdir(support.TESTFN)
Christian Heimesdd15f6c2008-03-16 00:07:10 +000099
100 def check_tempfile(self, name):
101 # make sure it doesn't already exist:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000102 self.assertFalse(os.path.exists(name),
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000103 "file already exists for temporary file")
104 # make sure we can create the file
105 open(name, "w")
106 self.files.append(name)
107
108 def test_tempnam(self):
109 if not hasattr(os, "tempnam"):
110 return
111 warnings.filterwarnings("ignore", "tempnam", RuntimeWarning,
112 r"test_os$")
113 self.check_tempfile(os.tempnam())
114
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000115 name = os.tempnam(support.TESTFN)
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000116 self.check_tempfile(name)
117
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000118 name = os.tempnam(support.TESTFN, "pfx")
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000119 self.assertTrue(os.path.basename(name)[:3] == "pfx")
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000120 self.check_tempfile(name)
121
122 def test_tmpfile(self):
123 if not hasattr(os, "tmpfile"):
124 return
125 # As with test_tmpnam() below, the Windows implementation of tmpfile()
126 # attempts to create a file in the root directory of the current drive.
127 # On Vista and Server 2008, this test will always fail for normal users
128 # as writing to the root directory requires elevated privileges. With
129 # XP and below, the semantics of tmpfile() are the same, but the user
130 # running the test is more likely to have administrative privileges on
131 # their account already. If that's the case, then os.tmpfile() should
132 # work. In order to make this test as useful as possible, rather than
133 # trying to detect Windows versions or whether or not the user has the
134 # right permissions, just try and create a file in the root directory
135 # and see if it raises a 'Permission denied' OSError. If it does, then
136 # test that a subsequent call to os.tmpfile() raises the same error. If
137 # it doesn't, assume we're on XP or below and the user running the test
138 # has administrative privileges, and proceed with the test as normal.
139 if sys.platform == 'win32':
140 name = '\\python_test_os_test_tmpfile.txt'
141 if os.path.exists(name):
142 os.remove(name)
143 try:
144 fp = open(name, 'w')
145 except IOError as first:
146 # open() failed, assert tmpfile() fails in the same way.
147 # Although open() raises an IOError and os.tmpfile() raises an
148 # OSError(), 'args' will be (13, 'Permission denied') in both
149 # cases.
150 try:
151 fp = os.tmpfile()
152 except OSError as second:
153 self.assertEqual(first.args, second.args)
154 else:
155 self.fail("expected os.tmpfile() to raise OSError")
156 return
157 else:
158 # open() worked, therefore, tmpfile() should work. Close our
159 # dummy file and proceed with the test as normal.
160 fp.close()
161 os.remove(name)
162
163 fp = os.tmpfile()
164 fp.write("foobar")
165 fp.seek(0,0)
166 s = fp.read()
167 fp.close()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000168 self.assertTrue(s == "foobar")
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000169
170 def test_tmpnam(self):
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000171 if not hasattr(os, "tmpnam"):
172 return
173 warnings.filterwarnings("ignore", "tmpnam", RuntimeWarning,
174 r"test_os$")
175 name = os.tmpnam()
176 if sys.platform in ("win32",):
177 # The Windows tmpnam() seems useless. From the MS docs:
178 #
179 # The character string that tmpnam creates consists of
180 # the path prefix, defined by the entry P_tmpdir in the
181 # file STDIO.H, followed by a sequence consisting of the
182 # digit characters '0' through '9'; the numerical value
183 # of this string is in the range 1 - 65,535. Changing the
184 # definitions of L_tmpnam or P_tmpdir in STDIO.H does not
185 # change the operation of tmpnam.
186 #
187 # The really bizarre part is that, at least under MSVC6,
188 # P_tmpdir is "\\". That is, the path returned refers to
189 # the root of the current drive. That's a terrible place to
190 # put temp files, and, depending on privileges, the user
191 # may not even be able to open a file in the root directory.
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000192 self.assertFalse(os.path.exists(name),
Christian Heimesdd15f6c2008-03-16 00:07:10 +0000193 "file already exists for temporary file")
194 else:
195 self.check_tempfile(name)
196
Amaury Forgeot d'Arce2e36ba2008-08-01 00:14:22 +0000197 def fdopen_helper(self, *args):
198 fd = os.open(support.TESTFN, os.O_RDONLY)
199 fp2 = os.fdopen(fd, *args)
200 fp2.close()
201
202 def test_fdopen(self):
203 self.fdopen_helper()
204 self.fdopen_helper('r')
205 self.fdopen_helper('r', 100)
206
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000207# Test attributes on return values from os.*stat* family.
208class StatAttributeTests(unittest.TestCase):
209 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000210 os.mkdir(support.TESTFN)
211 self.fname = os.path.join(support.TESTFN, "f1")
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000212 f = open(self.fname, 'wb')
Guido van Rossum26d95c32007-08-27 23:18:54 +0000213 f.write(b"ABC")
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000214 f.close()
Tim Peterse0c446b2001-10-18 21:57:37 +0000215
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000216 def tearDown(self):
217 os.unlink(self.fname)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000218 os.rmdir(support.TESTFN)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000219
220 def test_stat_attributes(self):
221 if not hasattr(os, "stat"):
222 return
223
224 import stat
225 result = os.stat(self.fname)
226
227 # Make sure direct access works
228 self.assertEquals(result[stat.ST_SIZE], 3)
229 self.assertEquals(result.st_size, 3)
230
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000231 # Make sure all the attributes are there
232 members = dir(result)
233 for name in dir(stat):
234 if name[:3] == 'ST_':
235 attr = name.lower()
Martin v. Löwis4d394df2005-01-23 09:19:22 +0000236 if name.endswith("TIME"):
237 def trunc(x): return int(x)
238 else:
239 def trunc(x): return x
240 self.assertEquals(trunc(getattr(result, attr)),
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000241 result[getattr(stat, name)])
Benjamin Peterson577473f2010-01-19 00:09:57 +0000242 self.assertIn(attr, members)
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000243
244 try:
245 result[200]
246 self.fail("No exception thrown")
247 except IndexError:
248 pass
249
250 # Make sure that assignment fails
251 try:
252 result.st_mode = 1
253 self.fail("No exception thrown")
Collin Winter42dae6a2007-03-28 21:44:53 +0000254 except AttributeError:
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000255 pass
256
257 try:
258 result.st_rdev = 1
259 self.fail("No exception thrown")
Guido van Rossum1fff8782001-10-18 21:19:31 +0000260 except (AttributeError, TypeError):
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000261 pass
262
263 try:
264 result.parrot = 1
265 self.fail("No exception thrown")
266 except AttributeError:
267 pass
268
269 # Use the stat_result constructor with a too-short tuple.
270 try:
271 result2 = os.stat_result((10,))
272 self.fail("No exception thrown")
273 except TypeError:
274 pass
275
276 # Use the constructr with a too-long tuple.
277 try:
278 result2 = os.stat_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14))
279 except TypeError:
280 pass
281
Tim Peterse0c446b2001-10-18 21:57:37 +0000282
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000283 def test_statvfs_attributes(self):
284 if not hasattr(os, "statvfs"):
285 return
286
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000287 try:
288 result = os.statvfs(self.fname)
Guido van Rossumb940e112007-01-10 16:19:56 +0000289 except OSError as e:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000290 # On AtheOS, glibc always returns ENOSYS
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000291 if e.errno == errno.ENOSYS:
292 return
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000293
294 # Make sure direct access works
Brett Cannoncfaf10c2008-05-16 00:45:35 +0000295 self.assertEquals(result.f_bfree, result[3])
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000296
Brett Cannoncfaf10c2008-05-16 00:45:35 +0000297 # Make sure all the attributes are there.
298 members = ('bsize', 'frsize', 'blocks', 'bfree', 'bavail', 'files',
299 'ffree', 'favail', 'flag', 'namemax')
300 for value, member in enumerate(members):
301 self.assertEquals(getattr(result, 'f_' + member), result[value])
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000302
303 # Make sure that assignment really fails
304 try:
305 result.f_bfree = 1
306 self.fail("No exception thrown")
Collin Winter42dae6a2007-03-28 21:44:53 +0000307 except AttributeError:
Guido van Rossum98bf58f2001-10-18 20:34:25 +0000308 pass
309
310 try:
311 result.parrot = 1
312 self.fail("No exception thrown")
313 except AttributeError:
314 pass
315
316 # Use the constructor with a too-short tuple.
317 try:
318 result2 = os.statvfs_result((10,))
319 self.fail("No exception thrown")
320 except TypeError:
321 pass
322
323 # Use the constructr with a too-long tuple.
324 try:
325 result2 = os.statvfs_result((0,1,2,3,4,5,6,7,8,9,10,11,12,13,14))
326 except TypeError:
327 pass
Fred Drake38c2ef02001-07-17 20:52:51 +0000328
Thomas Wouters89f507f2006-12-13 04:49:30 +0000329 def test_utime_dir(self):
330 delta = 1000000
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000331 st = os.stat(support.TESTFN)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000332 # round to int, because some systems may support sub-second
333 # time stamps in stat, but not in utime.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000334 os.utime(support.TESTFN, (st.st_atime, int(st.st_mtime-delta)))
335 st2 = os.stat(support.TESTFN)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000336 self.assertEquals(st2.st_mtime, int(st.st_mtime-delta))
337
338 # Restrict test to Win32, since there is no guarantee other
339 # systems support centiseconds
340 if sys.platform == 'win32':
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000341 def get_file_system(path):
Hirokazu Yamamoto5ef6d182008-08-20 04:17:24 +0000342 root = os.path.splitdrive(os.path.abspath(path))[0] + '\\'
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000343 import ctypes
Hirokazu Yamamotoca765d52008-08-20 16:18:19 +0000344 kernel32 = ctypes.windll.kernel32
Hirokazu Yamamoto5ef6d182008-08-20 04:17:24 +0000345 buf = ctypes.create_unicode_buffer("", 100)
Hirokazu Yamamotoca765d52008-08-20 16:18:19 +0000346 if kernel32.GetVolumeInformationW(root, None, 0, None, None, None, buf, len(buf)):
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000347 return buf.value
348
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000349 if get_file_system(support.TESTFN) == "NTFS":
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000350 def test_1565150(self):
351 t1 = 1159195039.25
352 os.utime(self.fname, (t1, t1))
353 self.assertEquals(os.stat(self.fname).st_mtime, t1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000354
Guido van Rossumd8faa362007-04-27 19:54:29 +0000355 def test_1686475(self):
356 # Verify that an open file can be stat'ed
357 try:
358 os.stat(r"c:\pagefile.sys")
359 except WindowsError as e:
Benjamin Petersonc4fe6f32008-08-19 18:57:56 +0000360 if e.errno == 2: # file does not exist; cannot run test
Guido van Rossumd8faa362007-04-27 19:54:29 +0000361 return
362 self.fail("Could not stat pagefile.sys")
363
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000364from test import mapping_tests
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000365
Walter Dörwald0a6d0ff2004-05-31 16:29:04 +0000366class EnvironTests(mapping_tests.BasicTestMappingProtocol):
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000367 """check that os.environ object conform to mapping protocol"""
Walter Dörwald118f9312004-06-02 18:42:25 +0000368 type2test = None
Christian Heimes90333392007-11-01 19:08:42 +0000369
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000370 def setUp(self):
371 self.__save = dict(os.environ)
Victor Stinner208d28c2010-05-07 00:54:14 +0000372 if os.name not in ('os2', 'nt'):
373 self.__saveb = dict(os.environb)
Christian Heimes90333392007-11-01 19:08:42 +0000374 for key, value in self._reference().items():
375 os.environ[key] = value
376
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000377 def tearDown(self):
378 os.environ.clear()
379 os.environ.update(self.__save)
Victor Stinner208d28c2010-05-07 00:54:14 +0000380 if os.name not in ('os2', 'nt'):
381 os.environb.clear()
382 os.environb.update(self.__saveb)
Raymond Hettinger2c2d3222003-03-09 07:05:43 +0000383
Christian Heimes90333392007-11-01 19:08:42 +0000384 def _reference(self):
385 return {"KEY1":"VALUE1", "KEY2":"VALUE2", "KEY3":"VALUE3"}
386
387 def _empty_mapping(self):
388 os.environ.clear()
389 return os.environ
390
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000391 # Bug 1110478
Martin v. Löwis5510f652005-02-17 21:23:20 +0000392 def test_update2(self):
Christian Heimes90333392007-11-01 19:08:42 +0000393 os.environ.clear()
Martin v. Löwis1d11de62005-01-29 13:29:23 +0000394 if os.path.exists("/bin/sh"):
395 os.environ.update(HELLO="World")
396 value = os.popen("/bin/sh -c 'echo $HELLO'").read().strip()
397 self.assertEquals(value, "World")
398
Christian Heimes1a13d592007-11-08 14:16:55 +0000399 def test_os_popen_iter(self):
400 if os.path.exists("/bin/sh"):
401 popen = os.popen("/bin/sh -c 'echo \"line1\nline2\nline3\"'")
402 it = iter(popen)
403 self.assertEquals(next(it), "line1\n")
404 self.assertEquals(next(it), "line2\n")
405 self.assertEquals(next(it), "line3\n")
406 self.assertRaises(StopIteration, next, it)
407
Guido van Rossum67aca9e2007-06-13 21:51:27 +0000408 # Verify environ keys and values from the OS are of the
409 # correct str type.
410 def test_keyvalue_types(self):
411 for key, val in os.environ.items():
412 self.assertEquals(type(key), str)
413 self.assertEquals(type(val), str)
414
Christian Heimes90333392007-11-01 19:08:42 +0000415 def test_items(self):
416 for key, value in self._reference().items():
417 self.assertEqual(os.environ.get(key), value)
418
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000419 # Issue 7310
420 def test___repr__(self):
421 """Check that the repr() of os.environ looks like environ({...})."""
422 env = os.environ
423 self.assertTrue(isinstance(env.data, dict))
424 self.assertEqual(repr(env), 'environ({!r})'.format(env.data))
425
Gregory P. Smithb6e8c7e2010-02-27 07:22:22 +0000426 def test_get_exec_path(self):
427 defpath_list = os.defpath.split(os.pathsep)
428 test_path = ['/monty', '/python', '', '/flying/circus']
429 test_env = {'PATH': os.pathsep.join(test_path)}
430
431 saved_environ = os.environ
432 try:
433 os.environ = dict(test_env)
434 # Test that defaulting to os.environ works.
435 self.assertSequenceEqual(test_path, os.get_exec_path())
436 self.assertSequenceEqual(test_path, os.get_exec_path(env=None))
437 finally:
438 os.environ = saved_environ
439
440 # No PATH environment variable
441 self.assertSequenceEqual(defpath_list, os.get_exec_path({}))
442 # Empty PATH environment variable
443 self.assertSequenceEqual(('',), os.get_exec_path({'PATH':''}))
444 # Supplied PATH environment variable
445 self.assertSequenceEqual(test_path, os.get_exec_path(test_env))
446
Victor Stinner84ae1182010-05-06 22:05:07 +0000447 @unittest.skipIf(sys.platform == "win32", "POSIX specific test")
448 def test_environb(self):
449 # os.environ -> os.environb
450 value = 'euro\u20ac'
451 try:
Benjamin Peterson180799d2010-05-06 22:25:42 +0000452 value_bytes = value.encode(sys.getfilesystemencoding(),
453 'surrogateescape')
Victor Stinner84ae1182010-05-06 22:05:07 +0000454 except UnicodeEncodeError:
Benjamin Peterson180799d2010-05-06 22:25:42 +0000455 msg = "U+20AC character is not encodable to %s" % (
456 sys.getfilesystemencoding(),)
Benjamin Peterson932d3f42010-05-06 22:26:31 +0000457 self.skipTest(msg)
Victor Stinner84ae1182010-05-06 22:05:07 +0000458 os.environ['unicode'] = value
459 self.assertEquals(os.environ['unicode'], value)
460 self.assertEquals(os.environb[b'unicode'], value_bytes)
461
462 # os.environb -> os.environ
463 value = b'\xff'
464 os.environb[b'bytes'] = value
465 self.assertEquals(os.environb[b'bytes'], value)
466 value_str = value.decode(sys.getfilesystemencoding(), 'surrogateescape')
467 self.assertEquals(os.environ['bytes'], value_str)
Ezio Melotti19e4acf2010-02-22 15:59:01 +0000468
Tim Petersc4e09402003-04-25 07:11:48 +0000469class WalkTests(unittest.TestCase):
470 """Tests for os.walk()."""
471
472 def test_traversal(self):
473 import os
474 from os.path import join
475
476 # Build:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000477 # TESTFN/
478 # TEST1/ a file kid and two directory kids
Tim Petersc4e09402003-04-25 07:11:48 +0000479 # tmp1
480 # SUB1/ a file kid and a directory kid
Guido van Rossumd8faa362007-04-27 19:54:29 +0000481 # tmp2
482 # SUB11/ no kids
483 # SUB2/ a file kid and a dirsymlink kid
484 # tmp3
485 # link/ a symlink to TESTFN.2
486 # TEST2/
487 # tmp4 a lone file
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000488 walk_path = join(support.TESTFN, "TEST1")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000489 sub1_path = join(walk_path, "SUB1")
Tim Petersc4e09402003-04-25 07:11:48 +0000490 sub11_path = join(sub1_path, "SUB11")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000491 sub2_path = join(walk_path, "SUB2")
492 tmp1_path = join(walk_path, "tmp1")
Tim Petersc4e09402003-04-25 07:11:48 +0000493 tmp2_path = join(sub1_path, "tmp2")
494 tmp3_path = join(sub2_path, "tmp3")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000495 link_path = join(sub2_path, "link")
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000496 t2_path = join(support.TESTFN, "TEST2")
497 tmp4_path = join(support.TESTFN, "TEST2", "tmp4")
Tim Petersc4e09402003-04-25 07:11:48 +0000498
499 # Create stuff.
500 os.makedirs(sub11_path)
501 os.makedirs(sub2_path)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000502 os.makedirs(t2_path)
503 for path in tmp1_path, tmp2_path, tmp3_path, tmp4_path:
Alex Martelli01c77c62006-08-24 02:58:11 +0000504 f = open(path, "w")
Tim Petersc4e09402003-04-25 07:11:48 +0000505 f.write("I'm " + path + " and proud of it. Blame test_os.\n")
506 f.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000507 if hasattr(os, "symlink"):
508 os.symlink(os.path.abspath(t2_path), link_path)
509 sub2_tree = (sub2_path, ["link"], ["tmp3"])
510 else:
511 sub2_tree = (sub2_path, [], ["tmp3"])
Tim Petersc4e09402003-04-25 07:11:48 +0000512
513 # Walk top-down.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000514 all = list(os.walk(walk_path))
Tim Petersc4e09402003-04-25 07:11:48 +0000515 self.assertEqual(len(all), 4)
516 # We can't know which order SUB1 and SUB2 will appear in.
517 # Not flipped: TESTFN, SUB1, SUB11, SUB2
518 # flipped: TESTFN, SUB2, SUB1, SUB11
519 flipped = all[0][1][0] != "SUB1"
520 all[0][1].sort()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000521 self.assertEqual(all[0], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
Tim Petersc4e09402003-04-25 07:11:48 +0000522 self.assertEqual(all[1 + flipped], (sub1_path, ["SUB11"], ["tmp2"]))
523 self.assertEqual(all[2 + flipped], (sub11_path, [], []))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000524 self.assertEqual(all[3 - 2 * flipped], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000525
526 # Prune the search.
527 all = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000528 for root, dirs, files in os.walk(walk_path):
Tim Petersc4e09402003-04-25 07:11:48 +0000529 all.append((root, dirs, files))
530 # Don't descend into SUB1.
531 if 'SUB1' in dirs:
532 # Note that this also mutates the dirs we appended to all!
533 dirs.remove('SUB1')
534 self.assertEqual(len(all), 2)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000535 self.assertEqual(all[0], (walk_path, ["SUB2"], ["tmp1"]))
536 self.assertEqual(all[1], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000537
538 # Walk bottom-up.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000539 all = list(os.walk(walk_path, topdown=False))
Tim Petersc4e09402003-04-25 07:11:48 +0000540 self.assertEqual(len(all), 4)
541 # We can't know which order SUB1 and SUB2 will appear in.
542 # Not flipped: SUB11, SUB1, SUB2, TESTFN
543 # flipped: SUB2, SUB11, SUB1, TESTFN
544 flipped = all[3][1][0] != "SUB1"
545 all[3][1].sort()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546 self.assertEqual(all[3], (walk_path, ["SUB1", "SUB2"], ["tmp1"]))
Tim Petersc4e09402003-04-25 07:11:48 +0000547 self.assertEqual(all[flipped], (sub11_path, [], []))
548 self.assertEqual(all[flipped + 1], (sub1_path, ["SUB11"], ["tmp2"]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000549 self.assertEqual(all[2 - 2 * flipped], sub2_tree)
Tim Petersc4e09402003-04-25 07:11:48 +0000550
Guido van Rossumd8faa362007-04-27 19:54:29 +0000551 if hasattr(os, "symlink"):
552 # Walk, following symlinks.
553 for root, dirs, files in os.walk(walk_path, followlinks=True):
554 if root == link_path:
555 self.assertEqual(dirs, [])
556 self.assertEqual(files, ["tmp4"])
557 break
558 else:
559 self.fail("Didn't follow symlink with followlinks=True")
560
561 def tearDown(self):
Tim Petersc4e09402003-04-25 07:11:48 +0000562 # Tear everything down. This is a decent use for bottom-up on
563 # Windows, which doesn't have a recursive delete command. The
564 # (not so) subtlety is that rmdir will fail unless the dir's
565 # kids are removed first, so bottom up is essential.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000566 for root, dirs, files in os.walk(support.TESTFN, topdown=False):
Tim Petersc4e09402003-04-25 07:11:48 +0000567 for name in files:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000568 os.remove(os.path.join(root, name))
Tim Petersc4e09402003-04-25 07:11:48 +0000569 for name in dirs:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000570 dirname = os.path.join(root, name)
571 if not os.path.islink(dirname):
572 os.rmdir(dirname)
573 else:
574 os.remove(dirname)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000575 os.rmdir(support.TESTFN)
Tim Petersc4e09402003-04-25 07:11:48 +0000576
Guido van Rossume7ba4952007-06-06 23:52:48 +0000577class MakedirTests(unittest.TestCase):
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000578 def setUp(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000579 os.mkdir(support.TESTFN)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000580
581 def test_makedir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000582 base = support.TESTFN
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000583 path = os.path.join(base, 'dir1', 'dir2', 'dir3')
584 os.makedirs(path) # Should work
585 path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4')
586 os.makedirs(path)
587
588 # Try paths with a '.' in them
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000589 self.assertRaises(OSError, os.makedirs, os.curdir)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000590 path = os.path.join(base, 'dir1', 'dir2', 'dir3', 'dir4', 'dir5', os.curdir)
591 os.makedirs(path)
592 path = os.path.join(base, 'dir1', os.curdir, 'dir2', 'dir3', 'dir4',
593 'dir5', 'dir6')
594 os.makedirs(path)
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000595
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000596 def tearDown(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000597 path = os.path.join(support.TESTFN, 'dir1', 'dir2', 'dir3',
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000598 'dir4', 'dir5', 'dir6')
599 # If the tests failed, the bottom-most directory ('../dir6')
600 # may not have been created, so we look for the outermost directory
601 # that exists.
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000602 while not os.path.exists(path) and path != support.TESTFN:
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000603 path = os.path.dirname(path)
604
605 os.removedirs(path)
606
Guido van Rossume7ba4952007-06-06 23:52:48 +0000607class DevNullTests(unittest.TestCase):
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000608 def test_devnull(self):
Alex Martelli01c77c62006-08-24 02:58:11 +0000609 f = open(os.devnull, 'w')
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000610 f.write('hello')
611 f.close()
Alex Martelli01c77c62006-08-24 02:58:11 +0000612 f = open(os.devnull, 'r')
Tim Peters4182cfd2004-06-08 20:34:34 +0000613 self.assertEqual(f.read(), '')
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000614 f.close()
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000615
Guido van Rossume7ba4952007-06-06 23:52:48 +0000616class URandomTests(unittest.TestCase):
Martin v. Löwisdc3883f2004-08-29 15:46:35 +0000617 def test_urandom(self):
618 try:
619 self.assertEqual(len(os.urandom(1)), 1)
620 self.assertEqual(len(os.urandom(10)), 10)
621 self.assertEqual(len(os.urandom(100)), 100)
622 self.assertEqual(len(os.urandom(1000)), 1000)
623 except NotImplementedError:
624 pass
625
Guido van Rossume7ba4952007-06-06 23:52:48 +0000626class ExecTests(unittest.TestCase):
Mark Dickinson7cf03892010-04-16 13:45:35 +0000627 @unittest.skipIf(USING_LINUXTHREADS,
628 "avoid triggering a linuxthreads bug: see issue #4970")
Guido van Rossume7ba4952007-06-06 23:52:48 +0000629 def test_execvpe_with_bad_program(self):
Mark Dickinson7cf03892010-04-16 13:45:35 +0000630 self.assertRaises(OSError, os.execvpe, 'no such app-',
631 ['no such app-'], None)
Guido van Rossume7ba4952007-06-06 23:52:48 +0000632
Thomas Heller6790d602007-08-30 17:15:14 +0000633 def test_execvpe_with_bad_arglist(self):
634 self.assertRaises(ValueError, os.execvpe, 'notepad', [], None)
635
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000636 class _stub_out_for_execvpe_test(object):
637 """
638 Stubs out execv, execve and get_exec_path functions when
639 used as context manager. Records exec calls. The mock execv
640 and execve functions always raise an exception as they would
641 normally never return.
642 """
643 def __init__(self):
644 # A list of tuples containing (function name, first arg, args)
645 # of calls to execv or execve that have been made.
646 self.calls = []
647 def _mock_execv(self, name, *args):
648 self.calls.append(('execv', name, args))
649 raise RuntimeError("execv called")
650
651 def _mock_execve(self, name, *args):
652 self.calls.append(('execve', name, args))
653 raise OSError(errno.ENOTDIR, "execve called")
654
655 def _mock_get_exec_path(self, env=None):
Gregory P. Smith3ea00622010-05-09 03:36:42 +0000656 return [os.sep+'p', os.sep+'pp']
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000657
658 def __enter__(self):
659 self.orig_execv = os.execv
660 self.orig_execve = os.execve
661 self.orig_get_exec_path = os.get_exec_path
662 os.execv = self._mock_execv
663 os.execve = self._mock_execve
664 os.get_exec_path = self._mock_get_exec_path
665
666 def __exit__(self, type, value, tb):
667 os.execv = self.orig_execv
668 os.execve = self.orig_execve
669 os.get_exec_path = self.orig_get_exec_path
670
671 @unittest.skipUnless(hasattr(os, '_execvpe'),
672 "No internal os._execvpe function to test.")
673 def test_internal_execvpe(self):
674 exec_stubbed = self._stub_out_for_execvpe_test()
675 with exec_stubbed:
Gregory P. Smith3ea00622010-05-09 03:36:42 +0000676 self.assertRaises(RuntimeError, os._execvpe, os.sep+'f', ['-a'])
677 self.assertEqual([('execv', os.sep+'f', (['-a'],))],
678 exec_stubbed.calls)
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000679 exec_stubbed.calls = []
680 self.assertRaises(OSError, os._execvpe, 'f', ['-a'],
681 env={'spam': 'beans'})
Gregory P. Smith3ea00622010-05-09 03:36:42 +0000682 self.assertEqual([('execve', os.sep+'p'+os.sep+'f',
683 (['-a'], {'spam': 'beans'})),
684 ('execve', os.sep+'pp'+os.sep+'f',
685 (['-a'], {'spam': 'beans'}))],
Gregory P. Smith4ae37772010-05-08 18:05:46 +0000686 exec_stubbed.calls)
687
Thomas Wouters477c8d52006-05-27 19:21:47 +0000688class Win32ErrorTests(unittest.TestCase):
689 def test_rename(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000690 self.assertRaises(WindowsError, os.rename, support.TESTFN, support.TESTFN+".bak")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000691
692 def test_remove(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000693 self.assertRaises(WindowsError, os.remove, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000694
695 def test_chdir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000696 self.assertRaises(WindowsError, os.chdir, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000697
698 def test_mkdir(self):
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000699 f = open(support.TESTFN, "w")
Benjamin Petersonf91df042009-02-13 02:50:59 +0000700 try:
701 self.assertRaises(WindowsError, os.mkdir, support.TESTFN)
702 finally:
703 f.close()
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000704 os.unlink(support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000705
706 def test_utime(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000707 self.assertRaises(WindowsError, os.utime, support.TESTFN, None)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000708
Thomas Wouters477c8d52006-05-27 19:21:47 +0000709 def test_chmod(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000710 self.assertRaises(WindowsError, os.chmod, support.TESTFN, 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000711
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000712class TestInvalidFD(unittest.TestCase):
Benjamin Peterson05e782f2009-01-19 15:15:02 +0000713 singles = ["fchdir", "dup", "fdopen", "fdatasync", "fstat",
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000714 "fstatvfs", "fsync", "tcgetpgrp", "ttyname"]
715 #singles.append("close")
716 #We omit close because it doesn'r raise an exception on some platforms
717 def get_single(f):
718 def helper(self):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000719 if hasattr(os, f):
720 self.check(getattr(os, f))
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000721 return helper
722 for f in singles:
723 locals()["test_"+f] = get_single(f)
724
Benjamin Peterson7522c742009-01-19 21:00:09 +0000725 def check(self, f, *args):
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000726 try:
727 f(support.make_bad_fd(), *args)
728 except OSError as e:
729 self.assertEqual(e.errno, errno.EBADF)
730 else:
731 self.fail("%r didn't raise a OSError with a bad file descriptor"
732 % f)
Benjamin Peterson7522c742009-01-19 21:00:09 +0000733
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000734 def test_isatty(self):
735 if hasattr(os, "isatty"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000736 self.assertEqual(os.isatty(support.make_bad_fd()), False)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000737
738 def test_closerange(self):
739 if hasattr(os, "closerange"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000740 fd = support.make_bad_fd()
R. David Murray630cc482009-07-22 15:20:27 +0000741 # Make sure none of the descriptors we are about to close are
742 # currently valid (issue 6542).
743 for i in range(10):
744 try: os.fstat(fd+i)
745 except OSError:
746 pass
747 else:
748 break
749 if i < 2:
750 raise unittest.SkipTest(
751 "Unable to acquire a range of invalid file descriptors")
752 self.assertEqual(os.closerange(fd, fd + i-1), None)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000753
754 def test_dup2(self):
755 if hasattr(os, "dup2"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000756 self.check(os.dup2, 20)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000757
758 def test_fchmod(self):
759 if hasattr(os, "fchmod"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000760 self.check(os.fchmod, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000761
762 def test_fchown(self):
763 if hasattr(os, "fchown"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000764 self.check(os.fchown, -1, -1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000765
766 def test_fpathconf(self):
767 if hasattr(os, "fpathconf"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000768 self.check(os.fpathconf, "PC_NAME_MAX")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000769
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000770 def test_ftruncate(self):
771 if hasattr(os, "ftruncate"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000772 self.check(os.ftruncate, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000773
774 def test_lseek(self):
775 if hasattr(os, "lseek"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000776 self.check(os.lseek, 0, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000777
778 def test_read(self):
779 if hasattr(os, "read"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000780 self.check(os.read, 1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000781
782 def test_tcsetpgrpt(self):
783 if hasattr(os, "tcsetpgrp"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000784 self.check(os.tcsetpgrp, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000785
786 def test_write(self):
787 if hasattr(os, "write"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000788 self.check(os.write, b" ")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000789
Thomas Wouters477c8d52006-05-27 19:21:47 +0000790if sys.platform != 'win32':
791 class Win32ErrorTests(unittest.TestCase):
792 pass
793
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000794 class PosixUidGidTests(unittest.TestCase):
795 if hasattr(os, 'setuid'):
796 def test_setuid(self):
797 if os.getuid() != 0:
798 self.assertRaises(os.error, os.setuid, 0)
799 self.assertRaises(OverflowError, os.setuid, 1<<32)
800
801 if hasattr(os, 'setgid'):
802 def test_setgid(self):
803 if os.getuid() != 0:
804 self.assertRaises(os.error, os.setgid, 0)
805 self.assertRaises(OverflowError, os.setgid, 1<<32)
806
807 if hasattr(os, 'seteuid'):
808 def test_seteuid(self):
809 if os.getuid() != 0:
810 self.assertRaises(os.error, os.seteuid, 0)
811 self.assertRaises(OverflowError, os.seteuid, 1<<32)
812
813 if hasattr(os, 'setegid'):
814 def test_setegid(self):
815 if os.getuid() != 0:
816 self.assertRaises(os.error, os.setegid, 0)
817 self.assertRaises(OverflowError, os.setegid, 1<<32)
818
819 if hasattr(os, 'setreuid'):
820 def test_setreuid(self):
821 if os.getuid() != 0:
822 self.assertRaises(os.error, os.setreuid, 0, 0)
823 self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
824 self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000825
826 def test_setreuid_neg1(self):
827 # Needs to accept -1. We run this in a subprocess to avoid
828 # altering the test runner's process state (issue8045).
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000829 subprocess.check_call([
830 sys.executable, '-c',
831 'import os,sys;os.setreuid(-1,-1);sys.exit(0)'])
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000832
833 if hasattr(os, 'setregid'):
834 def test_setregid(self):
835 if os.getuid() != 0:
836 self.assertRaises(os.error, os.setregid, 0, 0)
837 self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
838 self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000839
840 def test_setregid_neg1(self):
841 # Needs to accept -1. We run this in a subprocess to avoid
842 # altering the test runner's process state (issue8045).
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000843 subprocess.check_call([
844 sys.executable, '-c',
845 'import os,sys;os.setregid(-1,-1);sys.exit(0)'])
Martin v. Löwis011e8422009-05-05 04:43:17 +0000846
Mark Dickinson70613682009-05-05 21:34:59 +0000847 @unittest.skipIf(sys.platform == 'darwin', "tests don't apply to OS X")
Martin v. Löwis011e8422009-05-05 04:43:17 +0000848 class Pep383Tests(unittest.TestCase):
849 filenames = [b'foo\xf6bar', 'foo\xf6bar'.encode("utf-8")]
850
851 def setUp(self):
852 self.fsencoding = sys.getfilesystemencoding()
853 sys.setfilesystemencoding("utf-8")
854 self.dir = support.TESTFN
Martin v. Löwis43c57782009-05-10 08:15:24 +0000855 self.bdir = self.dir.encode("utf-8", "surrogateescape")
Martin v. Löwis011e8422009-05-05 04:43:17 +0000856 os.mkdir(self.dir)
857 self.unicodefn = []
858 for fn in self.filenames:
859 f = open(os.path.join(self.bdir, fn), "w")
860 f.close()
Martin v. Löwis43c57782009-05-10 08:15:24 +0000861 self.unicodefn.append(fn.decode("utf-8", "surrogateescape"))
Martin v. Löwis011e8422009-05-05 04:43:17 +0000862
863 def tearDown(self):
864 shutil.rmtree(self.dir)
865 sys.setfilesystemencoding(self.fsencoding)
866
867 def test_listdir(self):
868 expected = set(self.unicodefn)
869 found = set(os.listdir(support.TESTFN))
870 self.assertEquals(found, expected)
871
872 def test_open(self):
873 for fn in self.unicodefn:
874 f = open(os.path.join(self.dir, fn))
875 f.close()
876
877 def test_stat(self):
878 for fn in self.unicodefn:
879 os.stat(os.path.join(self.dir, fn))
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000880else:
881 class PosixUidGidTests(unittest.TestCase):
882 pass
Martin v. Löwis011e8422009-05-05 04:43:17 +0000883 class Pep383Tests(unittest.TestCase):
884 pass
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000885
Brian Curtineb24d742010-04-12 17:16:38 +0000886@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
887class Win32KillTests(unittest.TestCase):
888 def _kill(self, sig, *args):
889 # Send a subprocess a signal (or in some cases, just an int to be
890 # the return value)
891 proc = subprocess.Popen(*args)
892 os.kill(proc.pid, sig)
893 self.assertEqual(proc.wait(), sig)
894
895 def test_kill_sigterm(self):
896 # SIGTERM doesn't mean anything special, but make sure it works
897 self._kill(signal.SIGTERM, [sys.executable])
898
899 def test_kill_int(self):
900 # os.kill on Windows can take an int which gets set as the exit code
901 self._kill(100, [sys.executable])
902
903 def _kill_with_event(self, event, name):
904 # Run a script which has console control handling enabled.
905 proc = subprocess.Popen([sys.executable,
906 os.path.join(os.path.dirname(__file__),
907 "win_console_handler.py")],
908 creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
909 # Let the interpreter startup before we send signals. See #3137.
910 time.sleep(0.5)
911 os.kill(proc.pid, event)
912 # proc.send_signal(event) could also be done here.
913 # Allow time for the signal to be passed and the process to exit.
914 time.sleep(0.5)
915 if not proc.poll():
916 # Forcefully kill the process if we weren't able to signal it.
917 os.kill(proc.pid, signal.SIGINT)
918 self.fail("subprocess did not stop on {}".format(name))
919
920 @unittest.skip("subprocesses aren't inheriting CTRL+C property")
921 def test_CTRL_C_EVENT(self):
922 from ctypes import wintypes
923 import ctypes
924
925 # Make a NULL value by creating a pointer with no argument.
926 NULL = ctypes.POINTER(ctypes.c_int)()
927 SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
928 SetConsoleCtrlHandler.argtypes = (ctypes.POINTER(ctypes.c_int),
929 wintypes.BOOL)
930 SetConsoleCtrlHandler.restype = wintypes.BOOL
931
932 # Calling this with NULL and FALSE causes the calling process to
933 # handle CTRL+C, rather than ignore it. This property is inherited
934 # by subprocesses.
935 SetConsoleCtrlHandler(NULL, 0)
936
937 self._kill_with_event(signal.CTRL_C_EVENT, "CTRL_C_EVENT")
938
939 def test_CTRL_BREAK_EVENT(self):
940 self._kill_with_event(signal.CTRL_BREAK_EVENT, "CTRL_BREAK_EVENT")
941
942
Victor Stinnerbf9bcab2010-05-09 03:15:33 +0000943class MiscTests(unittest.TestCase):
Benjamin Peterson31191a92010-05-09 03:22:58 +0000944
945 @unittest.skipIf(os.name == "nt", "POSIX specific test")
Victor Stinnerbf9bcab2010-05-09 03:15:33 +0000946 def test_fsencode(self):
947 self.assertEquals(os.fsencode(b'ab\xff'), b'ab\xff')
948 self.assertEquals(os.fsencode('ab\uDCFF'), b'ab\xff')
949
950
Fred Drake2e2be372001-09-20 21:33:42 +0000951def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000952 support.run_unittest(
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000953 FileTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000954 StatAttributeTests,
955 EnvironTests,
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000956 WalkTests,
957 MakedirTests,
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000958 DevNullTests,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000959 URandomTests,
Guido van Rossume7ba4952007-06-06 23:52:48 +0000960 ExecTests,
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000961 Win32ErrorTests,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000962 TestInvalidFD,
Martin v. Löwis011e8422009-05-05 04:43:17 +0000963 PosixUidGidTests,
Brian Curtineb24d742010-04-12 17:16:38 +0000964 Pep383Tests,
Victor Stinnerbf9bcab2010-05-09 03:15:33 +0000965 Win32KillTests,
966 MiscTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000967 )
Fred Drake2e2be372001-09-20 21:33:42 +0000968
969if __name__ == "__main__":
970 test_main()