blob: 453b05836d4f4b42ddb9e7238aac72fdbb25272e [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):
656 return ['/p', '/pp']
657
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:
676 self.assertRaises(RuntimeError, os._execvpe, '/f', ['-a'])
677 self.assertEqual([('execv', '/f', (['-a'],))], exec_stubbed.calls)
678 exec_stubbed.calls = []
679 self.assertRaises(OSError, os._execvpe, 'f', ['-a'],
680 env={'spam': 'beans'})
681 self.assertEqual([('execve', '/p/f', (['-a'], {'spam': 'beans'})),
682 ('execve', '/pp/f', (['-a'], {'spam': 'beans'}))],
683 exec_stubbed.calls)
684
Thomas Wouters477c8d52006-05-27 19:21:47 +0000685class Win32ErrorTests(unittest.TestCase):
686 def test_rename(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000687 self.assertRaises(WindowsError, os.rename, support.TESTFN, support.TESTFN+".bak")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000688
689 def test_remove(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000690 self.assertRaises(WindowsError, os.remove, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000691
692 def test_chdir(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000693 self.assertRaises(WindowsError, os.chdir, support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000694
695 def test_mkdir(self):
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000696 f = open(support.TESTFN, "w")
Benjamin Petersonf91df042009-02-13 02:50:59 +0000697 try:
698 self.assertRaises(WindowsError, os.mkdir, support.TESTFN)
699 finally:
700 f.close()
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000701 os.unlink(support.TESTFN)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000702
703 def test_utime(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000704 self.assertRaises(WindowsError, os.utime, support.TESTFN, None)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000705
Thomas Wouters477c8d52006-05-27 19:21:47 +0000706 def test_chmod(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +0000707 self.assertRaises(WindowsError, os.chmod, support.TESTFN, 0)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000708
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000709class TestInvalidFD(unittest.TestCase):
Benjamin Peterson05e782f2009-01-19 15:15:02 +0000710 singles = ["fchdir", "dup", "fdopen", "fdatasync", "fstat",
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000711 "fstatvfs", "fsync", "tcgetpgrp", "ttyname"]
712 #singles.append("close")
713 #We omit close because it doesn'r raise an exception on some platforms
714 def get_single(f):
715 def helper(self):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000716 if hasattr(os, f):
717 self.check(getattr(os, f))
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000718 return helper
719 for f in singles:
720 locals()["test_"+f] = get_single(f)
721
Benjamin Peterson7522c742009-01-19 21:00:09 +0000722 def check(self, f, *args):
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000723 try:
724 f(support.make_bad_fd(), *args)
725 except OSError as e:
726 self.assertEqual(e.errno, errno.EBADF)
727 else:
728 self.fail("%r didn't raise a OSError with a bad file descriptor"
729 % f)
Benjamin Peterson7522c742009-01-19 21:00:09 +0000730
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000731 def test_isatty(self):
732 if hasattr(os, "isatty"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000733 self.assertEqual(os.isatty(support.make_bad_fd()), False)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000734
735 def test_closerange(self):
736 if hasattr(os, "closerange"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000737 fd = support.make_bad_fd()
R. David Murray630cc482009-07-22 15:20:27 +0000738 # Make sure none of the descriptors we are about to close are
739 # currently valid (issue 6542).
740 for i in range(10):
741 try: os.fstat(fd+i)
742 except OSError:
743 pass
744 else:
745 break
746 if i < 2:
747 raise unittest.SkipTest(
748 "Unable to acquire a range of invalid file descriptors")
749 self.assertEqual(os.closerange(fd, fd + i-1), None)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000750
751 def test_dup2(self):
752 if hasattr(os, "dup2"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000753 self.check(os.dup2, 20)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000754
755 def test_fchmod(self):
756 if hasattr(os, "fchmod"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000757 self.check(os.fchmod, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000758
759 def test_fchown(self):
760 if hasattr(os, "fchown"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000761 self.check(os.fchown, -1, -1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000762
763 def test_fpathconf(self):
764 if hasattr(os, "fpathconf"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000765 self.check(os.fpathconf, "PC_NAME_MAX")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000766
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000767 def test_ftruncate(self):
768 if hasattr(os, "ftruncate"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000769 self.check(os.ftruncate, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000770
771 def test_lseek(self):
772 if hasattr(os, "lseek"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000773 self.check(os.lseek, 0, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000774
775 def test_read(self):
776 if hasattr(os, "read"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000777 self.check(os.read, 1)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000778
779 def test_tcsetpgrpt(self):
780 if hasattr(os, "tcsetpgrp"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000781 self.check(os.tcsetpgrp, 0)
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000782
783 def test_write(self):
784 if hasattr(os, "write"):
Benjamin Peterson7522c742009-01-19 21:00:09 +0000785 self.check(os.write, b" ")
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000786
Thomas Wouters477c8d52006-05-27 19:21:47 +0000787if sys.platform != 'win32':
788 class Win32ErrorTests(unittest.TestCase):
789 pass
790
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000791 class PosixUidGidTests(unittest.TestCase):
792 if hasattr(os, 'setuid'):
793 def test_setuid(self):
794 if os.getuid() != 0:
795 self.assertRaises(os.error, os.setuid, 0)
796 self.assertRaises(OverflowError, os.setuid, 1<<32)
797
798 if hasattr(os, 'setgid'):
799 def test_setgid(self):
800 if os.getuid() != 0:
801 self.assertRaises(os.error, os.setgid, 0)
802 self.assertRaises(OverflowError, os.setgid, 1<<32)
803
804 if hasattr(os, 'seteuid'):
805 def test_seteuid(self):
806 if os.getuid() != 0:
807 self.assertRaises(os.error, os.seteuid, 0)
808 self.assertRaises(OverflowError, os.seteuid, 1<<32)
809
810 if hasattr(os, 'setegid'):
811 def test_setegid(self):
812 if os.getuid() != 0:
813 self.assertRaises(os.error, os.setegid, 0)
814 self.assertRaises(OverflowError, os.setegid, 1<<32)
815
816 if hasattr(os, 'setreuid'):
817 def test_setreuid(self):
818 if os.getuid() != 0:
819 self.assertRaises(os.error, os.setreuid, 0, 0)
820 self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
821 self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000822
823 def test_setreuid_neg1(self):
824 # Needs to accept -1. We run this in a subprocess to avoid
825 # altering the test runner's process state (issue8045).
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000826 subprocess.check_call([
827 sys.executable, '-c',
828 'import os,sys;os.setreuid(-1,-1);sys.exit(0)'])
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000829
830 if hasattr(os, 'setregid'):
831 def test_setregid(self):
832 if os.getuid() != 0:
833 self.assertRaises(os.error, os.setregid, 0, 0)
834 self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
835 self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000836
837 def test_setregid_neg1(self):
838 # Needs to accept -1. We run this in a subprocess to avoid
839 # altering the test runner's process state (issue8045).
Benjamin Petersonebe87ba2010-03-06 20:34:24 +0000840 subprocess.check_call([
841 sys.executable, '-c',
842 'import os,sys;os.setregid(-1,-1);sys.exit(0)'])
Martin v. Löwis011e8422009-05-05 04:43:17 +0000843
Mark Dickinson70613682009-05-05 21:34:59 +0000844 @unittest.skipIf(sys.platform == 'darwin', "tests don't apply to OS X")
Martin v. Löwis011e8422009-05-05 04:43:17 +0000845 class Pep383Tests(unittest.TestCase):
846 filenames = [b'foo\xf6bar', 'foo\xf6bar'.encode("utf-8")]
847
848 def setUp(self):
849 self.fsencoding = sys.getfilesystemencoding()
850 sys.setfilesystemencoding("utf-8")
851 self.dir = support.TESTFN
Martin v. Löwis43c57782009-05-10 08:15:24 +0000852 self.bdir = self.dir.encode("utf-8", "surrogateescape")
Martin v. Löwis011e8422009-05-05 04:43:17 +0000853 os.mkdir(self.dir)
854 self.unicodefn = []
855 for fn in self.filenames:
856 f = open(os.path.join(self.bdir, fn), "w")
857 f.close()
Martin v. Löwis43c57782009-05-10 08:15:24 +0000858 self.unicodefn.append(fn.decode("utf-8", "surrogateescape"))
Martin v. Löwis011e8422009-05-05 04:43:17 +0000859
860 def tearDown(self):
861 shutil.rmtree(self.dir)
862 sys.setfilesystemencoding(self.fsencoding)
863
864 def test_listdir(self):
865 expected = set(self.unicodefn)
866 found = set(os.listdir(support.TESTFN))
867 self.assertEquals(found, expected)
868
869 def test_open(self):
870 for fn in self.unicodefn:
871 f = open(os.path.join(self.dir, fn))
872 f.close()
873
874 def test_stat(self):
875 for fn in self.unicodefn:
876 os.stat(os.path.join(self.dir, fn))
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000877else:
878 class PosixUidGidTests(unittest.TestCase):
879 pass
Martin v. Löwis011e8422009-05-05 04:43:17 +0000880 class Pep383Tests(unittest.TestCase):
881 pass
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000882
Brian Curtineb24d742010-04-12 17:16:38 +0000883@unittest.skipUnless(sys.platform == "win32", "Win32 specific tests")
884class Win32KillTests(unittest.TestCase):
885 def _kill(self, sig, *args):
886 # Send a subprocess a signal (or in some cases, just an int to be
887 # the return value)
888 proc = subprocess.Popen(*args)
889 os.kill(proc.pid, sig)
890 self.assertEqual(proc.wait(), sig)
891
892 def test_kill_sigterm(self):
893 # SIGTERM doesn't mean anything special, but make sure it works
894 self._kill(signal.SIGTERM, [sys.executable])
895
896 def test_kill_int(self):
897 # os.kill on Windows can take an int which gets set as the exit code
898 self._kill(100, [sys.executable])
899
900 def _kill_with_event(self, event, name):
901 # Run a script which has console control handling enabled.
902 proc = subprocess.Popen([sys.executable,
903 os.path.join(os.path.dirname(__file__),
904 "win_console_handler.py")],
905 creationflags=subprocess.CREATE_NEW_PROCESS_GROUP)
906 # Let the interpreter startup before we send signals. See #3137.
907 time.sleep(0.5)
908 os.kill(proc.pid, event)
909 # proc.send_signal(event) could also be done here.
910 # Allow time for the signal to be passed and the process to exit.
911 time.sleep(0.5)
912 if not proc.poll():
913 # Forcefully kill the process if we weren't able to signal it.
914 os.kill(proc.pid, signal.SIGINT)
915 self.fail("subprocess did not stop on {}".format(name))
916
917 @unittest.skip("subprocesses aren't inheriting CTRL+C property")
918 def test_CTRL_C_EVENT(self):
919 from ctypes import wintypes
920 import ctypes
921
922 # Make a NULL value by creating a pointer with no argument.
923 NULL = ctypes.POINTER(ctypes.c_int)()
924 SetConsoleCtrlHandler = ctypes.windll.kernel32.SetConsoleCtrlHandler
925 SetConsoleCtrlHandler.argtypes = (ctypes.POINTER(ctypes.c_int),
926 wintypes.BOOL)
927 SetConsoleCtrlHandler.restype = wintypes.BOOL
928
929 # Calling this with NULL and FALSE causes the calling process to
930 # handle CTRL+C, rather than ignore it. This property is inherited
931 # by subprocesses.
932 SetConsoleCtrlHandler(NULL, 0)
933
934 self._kill_with_event(signal.CTRL_C_EVENT, "CTRL_C_EVENT")
935
936 def test_CTRL_BREAK_EVENT(self):
937 self._kill_with_event(signal.CTRL_BREAK_EVENT, "CTRL_BREAK_EVENT")
938
939
Fred Drake2e2be372001-09-20 21:33:42 +0000940def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000941 support.run_unittest(
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000942 FileTests,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000943 StatAttributeTests,
944 EnvironTests,
Andrew M. Kuchlingb386f6a2003-12-23 16:36:11 +0000945 WalkTests,
946 MakedirTests,
Martin v. Löwisbdec50f2004-06-08 08:29:33 +0000947 DevNullTests,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000948 URandomTests,
Guido van Rossume7ba4952007-06-06 23:52:48 +0000949 ExecTests,
Benjamin Petersone1cdfd72009-01-18 21:02:37 +0000950 Win32ErrorTests,
Benjamin Petersonef3e4c22009-04-11 19:48:14 +0000951 TestInvalidFD,
Martin v. Löwis011e8422009-05-05 04:43:17 +0000952 PosixUidGidTests,
Brian Curtineb24d742010-04-12 17:16:38 +0000953 Pep383Tests,
954 Win32KillTests
Walter Dörwald21d3a322003-05-01 17:45:56 +0000955 )
Fred Drake2e2be372001-09-20 21:33:42 +0000956
957if __name__ == "__main__":
958 test_main()