annotate Lib/test/test_fileio.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents d7040647d590
children 2f314971e164
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 # Adapted from test_file.py by Daniel Stutzbach
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
2
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
3 from __future__ import unicode_literals
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
4
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
5 import sys
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
6 import os
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
7 import errno
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
8 import unittest
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
9 from array import array
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
10 from weakref import proxy
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
11 from functools import wraps
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
12
58817
70e115c34f97 Remove unused imports in test modules.
Georg Brandl <georg@python.org>
parents: 58624
diff changeset
13 from test.test_support import TESTFN, check_warnings, run_unittest, make_bad_fd
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
14 from test.test_support import py3k_bytes as bytes
60722
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
15 from test.script_helper import run_python
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
16
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
17 from _io import FileIO as _FileIO
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
18
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
19 class AutoFileTests(unittest.TestCase):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
20 # file tests for which a test file is automatically set up
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
21
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
22 def setUp(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
23 self.f = _FileIO(TESTFN, 'w')
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
24
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
25 def tearDown(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
26 if self.f:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
27 self.f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
28 os.remove(TESTFN)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
29
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
30 def testWeakRefs(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
31 # verify weak references
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
32 p = proxy(self.f)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
33 p.write(bytes(range(10)))
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
34 self.assertEqual(self.f.tell(), p.tell())
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
35 self.f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
36 self.f = None
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
37 self.assertRaises(ReferenceError, getattr, p, 'tell')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
38
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
39 def testSeekTell(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
40 self.f.write(bytes(range(20)))
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
41 self.assertEqual(self.f.tell(), 20)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
42 self.f.seek(0)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
43 self.assertEqual(self.f.tell(), 0)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
44 self.f.seek(10)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
45 self.assertEqual(self.f.tell(), 10)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
46 self.f.seek(5, 1)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
47 self.assertEqual(self.f.tell(), 15)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
48 self.f.seek(-5, 1)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
49 self.assertEqual(self.f.tell(), 10)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
50 self.f.seek(-5, 2)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
51 self.assertEqual(self.f.tell(), 15)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
52
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
53 def testAttributes(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
54 # verify expected attributes exist
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
55 f = self.f
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
56
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
57 self.assertEqual(f.mode, "wb")
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
58 self.assertEqual(f.closed, False)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
59
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
60 # verify the attributes are readonly
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
61 for attr in 'mode', 'closed':
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
62 self.assertRaises((AttributeError, TypeError),
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
63 setattr, f, attr, 'oops')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
64
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
65 def testReadinto(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
66 # verify readinto
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
67 self.f.write(b"\x01\x02")
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
68 self.f.close()
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
69 a = array(b'b', b'x'*10)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
70 self.f = _FileIO(TESTFN, 'r')
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
71 n = self.f.readinto(a)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
72 self.assertEqual(array(b'b', [1, 2]), a[:n])
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
73
57703
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
74 def test_none_args(self):
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
75 self.f.write(b"hi\nbye\nabc")
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
76 self.f.close()
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
77 self.f = _FileIO(TESTFN, 'r')
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
78 self.assertEqual(self.f.read(None), b"hi\nbye\nabc")
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
79 self.f.seek(0)
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
80 self.assertEqual(self.f.readline(None), b"hi\n")
54f84558ad2b accept None as the same as having passed no argument in file types #7349
Benjamin Peterson <benjamin@python.org>
parents: 55002
diff changeset
81 self.assertEqual(self.f.readlines(None), [b"bye\n", b"abc"])
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
82
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
83 def testRepr(self):
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
84 self.assertEqual(repr(self.f), "<_io.FileIO name=%r mode='%s'>"
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
85 % (self.f.name, self.f.mode))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
86 del self.f.name
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
87 self.assertEqual(repr(self.f), "<_io.FileIO fd=%r mode='%s'>"
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
88 % (self.f.fileno(), self.f.mode))
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
89 self.f.close()
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
90 self.assertEqual(repr(self.f), "<_io.FileIO [closed]>")
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
91
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
92 def testErrors(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
93 f = self.f
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54717
diff changeset
94 self.assertTrue(not f.isatty())
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54717
diff changeset
95 self.assertTrue(not f.closed)
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
96 #self.assertEqual(f.name, TESTFN)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
97 self.assertRaises(ValueError, f.read, 10) # Open for reading
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
98 f.close()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54717
diff changeset
99 self.assertTrue(f.closed)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
100 f = _FileIO(TESTFN, 'r')
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
101 self.assertRaises(TypeError, f.readinto, "")
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54717
diff changeset
102 self.assertTrue(not f.closed)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
103 f.close()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54717
diff changeset
104 self.assertTrue(f.closed)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
105
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
106 def testMethods(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
107 methods = ['fileno', 'isatty', 'read', 'readinto',
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
108 'seek', 'tell', 'truncate', 'write', 'seekable',
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
109 'readable', 'writable']
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
110 if sys.platform.startswith('atheos'):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
111 methods.remove('truncate')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
112
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
113 self.f.close()
55002
6768b2350c57 convert usage of fail* to assert*
Benjamin Peterson <benjamin@python.org>
parents: 54717
diff changeset
114 self.assertTrue(self.f.closed)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
115
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
116 for methodname in methods:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
117 method = getattr(self.f, methodname)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
118 # should raise on closed file
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
119 self.assertRaises(ValueError, method)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
120
48918
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
121 def testOpendir(self):
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
122 # Issue 3703: opening a directory should fill the errno
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
123 # Windows always returns "[Errno 13]: Permission denied
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
124 # Unix calls dircheck() and returns "[Errno 21]: Is a directory"
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
125 try:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
126 _FileIO('.', 'r')
48918
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
127 except IOError as e:
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
128 self.assertNotEqual(e.errno, 0)
50424
df3923c36ec5 Merged revisions 67952-67953,67955,67957-67958,67960-67961,67963,67965,67967,67970-67971,67973,67982,67988,67990,67995,68014,68016,68030,68057,68061,68112,68115-68118,68120-68121,68123-68128 via svnmerge from
Georg Brandl <georg@python.org>
parents: 50008
diff changeset
129 self.assertEqual(e.filename, ".")
48918
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
130 else:
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
131 self.fail("Should have raised IOError")
7b39501b0a76 #3703 unhelpful _fileio.FileIO error message when trying to open a directory
Benjamin Peterson <benjamin@python.org>
parents: 48859
diff changeset
132
77956
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
133 @unittest.skipIf(os.name == 'nt', "test only works on a POSIX-like system")
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
134 def testOpenDirFD(self):
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
135 fd = os.open('.', os.O_RDONLY)
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
136 with self.assertRaises(IOError) as cm:
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
137 _FileIO(fd, 'r')
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
138 os.close(fd)
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
139 self.assertEqual(cm.exception.errno, errno.EISDIR)
d7040647d590 Issue #15247: FileIO now raises an error when given a file descriptor pointing to a directory.
Antoine Pitrou <solipsis@pitrou.net>
parents: 77537
diff changeset
140
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
141 #A set of functions testing that we get expected behaviour if someone has
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
142 #manually closed the internal file descriptor. First, a decorator:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
143 def ClosedFD(func):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
144 @wraps(func)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
145 def wrapper(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
146 #forcibly close the fd before invoking the problem function
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
147 f = self.f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
148 os.close(f.fileno())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
149 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
150 func(self, f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
151 finally:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
152 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
153 self.f.close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
154 except IOError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
155 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
156 return wrapper
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
157
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
158 def ClosedFDRaises(func):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
159 @wraps(func)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
160 def wrapper(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
161 #forcibly close the fd before invoking the problem function
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
162 f = self.f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
163 os.close(f.fileno())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
164 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
165 func(self, f)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
166 except IOError as e:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
167 self.assertEqual(e.errno, errno.EBADF)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
168 else:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
169 self.fail("Should have raised IOError")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
170 finally:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
171 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
172 self.f.close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
173 except IOError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
174 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
175 return wrapper
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
176
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
177 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
178 def testErrnoOnClose(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
179 f.close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
180
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
181 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
182 def testErrnoOnClosedWrite(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
183 f.write('a')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
184
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
185 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
186 def testErrnoOnClosedSeek(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
187 f.seek(0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
188
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
189 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
190 def testErrnoOnClosedTell(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
191 f.tell()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
192
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
193 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
194 def testErrnoOnClosedTruncate(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
195 f.truncate(0)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
196
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
197 @ClosedFD
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
198 def testErrnoOnClosedSeekable(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
199 f.seekable()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
200
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
201 @ClosedFD
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
202 def testErrnoOnClosedReadable(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
203 f.readable()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
204
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
205 @ClosedFD
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
206 def testErrnoOnClosedWritable(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
207 f.writable()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
208
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
209 @ClosedFD
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
210 def testErrnoOnClosedFileno(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
211 f.fileno()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
212
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
213 @ClosedFD
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
214 def testErrnoOnClosedIsatty(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
215 self.assertEqual(f.isatty(), False)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
216
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
217 def ReopenForRead(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
218 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
219 self.f.close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
220 except IOError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
221 pass
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
222 self.f = _FileIO(TESTFN, 'r')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
223 os.close(self.f.fileno())
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
224 return self.f
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
225
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
226 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
227 def testErrnoOnClosedRead(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
228 f = self.ReopenForRead()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
229 f.read(1)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
230
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
231 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
232 def testErrnoOnClosedReadall(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
233 f = self.ReopenForRead()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
234 f.readall()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
235
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
236 @ClosedFDRaises
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
237 def testErrnoOnClosedReadinto(self, f):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
238 f = self.ReopenForRead()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
239 a = array(b'b', b'x'*10)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
240 f.readinto(a)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
241
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
242 class OtherFileTests(unittest.TestCase):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
243
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
244 def testAbles(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
245 try:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
246 f = _FileIO(TESTFN, "w")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
247 self.assertEqual(f.readable(), False)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
248 self.assertEqual(f.writable(), True)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
249 self.assertEqual(f.seekable(), True)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
250 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
251
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
252 f = _FileIO(TESTFN, "r")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
253 self.assertEqual(f.readable(), True)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
254 self.assertEqual(f.writable(), False)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
255 self.assertEqual(f.seekable(), True)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
256 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
257
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
258 f = _FileIO(TESTFN, "a+")
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
259 self.assertEqual(f.readable(), True)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
260 self.assertEqual(f.writable(), True)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
261 self.assertEqual(f.seekable(), True)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
262 self.assertEqual(f.isatty(), False)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
263 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
264
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
265 if sys.platform != "win32":
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
266 try:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
267 f = _FileIO("/dev/tty", "a")
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
268 except EnvironmentError:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
269 # When run in a cron job there just aren't any
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
270 # ttys, so skip the test. This also handles other
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
271 # OS'es that don't support /dev/tty.
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
272 pass
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
273 else:
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
274 self.assertEqual(f.readable(), False)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
275 self.assertEqual(f.writable(), True)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
276 if sys.platform != "darwin" and \
54279
9fd1d54f617c Merged revisions 72859 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50914
diff changeset
277 'bsd' not in sys.platform and \
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
278 not sys.platform.startswith('sunos'):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
279 # Somehow /dev/tty appears seekable on some BSDs
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
280 self.assertEqual(f.seekable(), False)
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
281 self.assertEqual(f.isatty(), True)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
282 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
283 finally:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
284 os.unlink(TESTFN)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
285
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
286 def testModeStrings(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
287 # check invalid mode strings
50008
11bf59fe10b9 Merged revisions 67326,67498,67531-67532,67538,67553-67554,67556-67557 via svnmerge from
Georg Brandl <georg@python.org>
parents: 49677
diff changeset
288 for mode in ("", "aU", "wU+", "rw", "rt"):
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
289 try:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
290 f = _FileIO(TESTFN, mode)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
291 except ValueError:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
292 pass
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
293 else:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
294 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
295 self.fail('%r is an invalid file mode' % mode)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
296
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
297 def testUnicodeOpen(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
298 # verify repr works for unicode too
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
299 f = _FileIO(str(TESTFN), "w")
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
300 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
301 os.unlink(TESTFN)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
302
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
303 def testBytesOpen(self):
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
304 # Opening a bytes filename
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
305 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
306 fn = TESTFN.encode("ascii")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
307 except UnicodeEncodeError:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
308 # Skip test
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
309 return
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
310 f = _FileIO(fn, "w")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
311 try:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
312 f.write(b"abc")
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
313 f.close()
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
314 with open(TESTFN, "rb") as f:
66348
614c84670c63 Merged revisions 86596 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 65807
diff changeset
315 self.assertEqual(f.read(), b"abc")
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
316 finally:
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
317 os.unlink(TESTFN)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
318
50906
aeb2bde203aa Merged revisions 68755 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50424
diff changeset
319 def testInvalidFd(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
320 self.assertRaises(ValueError, _FileIO, -10)
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
321 self.assertRaises(OSError, _FileIO, make_bad_fd())
64446
98083f876455 Merged revisions 84506 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
322 if sys.platform == 'win32':
98083f876455 Merged revisions 84506 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
323 import msvcrt
98083f876455 Merged revisions 84506 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60722
diff changeset
324 self.assertRaises(IOError, msvcrt.get_osfhandle, make_bad_fd())
50906
aeb2bde203aa Merged revisions 68755 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 50424
diff changeset
325
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
326 def testBadModeArgument(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
327 # verify that we get a sensible error message for bad mode argument
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
328 bad_mode = "qwerty"
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
329 try:
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
330 f = _FileIO(TESTFN, bad_mode)
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
331 except ValueError as msg:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
332 if msg.args[0] != 0:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
333 s = str(msg)
59951
e9b958e8391b Merged revisions 73824,78887,78895,78900,79024 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 58544
diff changeset
334 if TESTFN in s or bad_mode not in s:
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
335 self.fail("bad error message for invalid mode: %s" % s)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
336 # if msg.args[0] == 0, we're probably on Windows where there may be
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
337 # no obvious way to discover why open() failed.
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
338 else:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
339 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
340 self.fail("no error for invalid mode: %s" % bad_mode)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
341
58544
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
342 def testTruncate(self):
58624
77130f2fe944 - Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 57703
diff changeset
343 f = _FileIO(TESTFN, 'w')
58544
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
344 f.write(bytes(bytearray(range(10))))
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
345 self.assertEqual(f.tell(), 10)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
346 f.truncate(5)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
347 self.assertEqual(f.tell(), 10)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
348 self.assertEqual(f.seek(0, os.SEEK_END), 5)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
349 f.truncate(15)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
350 self.assertEqual(f.tell(), 5)
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
351 self.assertEqual(f.seek(0, os.SEEK_END), 15)
65807
9e291be489cf Merged revisions 85982 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 65784
diff changeset
352 f.close()
58544
0bd616dfc977 Issue #6939: Fix file I/O objects in the `io` module to keep the original
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
353
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
354 def testTruncateOnWindows(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
355 def bug801631():
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
356 # SF bug <http://www.python.org/sf/801631>
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
357 # "file.truncate fault on windows"
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
358 f = _FileIO(TESTFN, 'w')
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
359 f.write(bytes(range(11)))
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
360 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
361
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
362 f = _FileIO(TESTFN,'r+')
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
363 data = f.read(5)
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
364 if data != bytes(range(5)):
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
365 self.fail("Read on file opened for update failed %r" % data)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
366 if f.tell() != 5:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
367 self.fail("File pos after read wrong %d" % f.tell())
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
368
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
369 f.truncate()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
370 if f.tell() != 5:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
371 self.fail("File pos after ftruncate wrong %d" % f.tell())
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
372
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
373 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
374 size = os.path.getsize(TESTFN)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
375 if size != 5:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
376 self.fail("File size after ftruncate wrong %d" % size)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
377
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
378 try:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
379 bug801631()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
380 finally:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
381 os.unlink(TESTFN)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
382
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
383 def testAppend(self):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
384 try:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
385 f = open(TESTFN, 'wb')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
386 f.write(b'spam')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
387 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
388 f = open(TESTFN, 'ab')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
389 f.write(b'eggs')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
390 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
391 f = open(TESTFN, 'rb')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
392 d = f.read()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
393 f.close()
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
394 self.assertEqual(d, b'spameggs')
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
395 finally:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
396 try:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
397 os.unlink(TESTFN)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
398 except:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
399 pass
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
400
48859
de954dd6797b #3662: Fix segfault introduced when fixing memory leaks.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48016
diff changeset
401 def testInvalidInit(self):
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
402 self.assertRaises(TypeError, _FileIO, "1", 0, 0)
48859
de954dd6797b #3662: Fix segfault introduced when fixing memory leaks.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48016
diff changeset
403
49677
82ccc7e77ec5 Merged revisions 66801,66803-66804,66813,66854-66856,66866,66870-66872,66874,66887,66903,66905,66911,66913,66927,66932,66938,66942,66962,66964,66973-66974,66977,66992,66998-66999,67002,67005,67007,67028,67040-67041,67044,67070,67089,67091,67101,67117-67119,67123-67124 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48918
diff changeset
404 def testWarnings(self):
63553
7c3b849d181a Merged revisions 78758 via svnmerge from
Ezio Melotti <ezio.melotti@gmail.com>
parents: 59951
diff changeset
405 with check_warnings(quiet=True) as w:
49677
82ccc7e77ec5 Merged revisions 66801,66803-66804,66813,66854-66856,66866,66870-66872,66874,66887,66903,66905,66911,66913,66927,66932,66938,66942,66962,66964,66973-66974,66977,66992,66998-66999,67002,67005,67007,67028,67040-67041,67044,67070,67089,67091,67101,67117-67119,67123-67124 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48918
diff changeset
406 self.assertEqual(w.warnings, [])
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
407 self.assertRaises(TypeError, _FileIO, [])
49677
82ccc7e77ec5 Merged revisions 66801,66803-66804,66813,66854-66856,66866,66870-66872,66874,66887,66903,66905,66911,66913,66927,66932,66938,66942,66962,66964,66973-66974,66977,66992,66998-66999,67002,67005,67007,67028,67040-67041,67044,67070,67089,67091,67101,67117-67119,67123-67124 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48918
diff changeset
408 self.assertEqual(w.warnings, [])
54717
760a710eb6c1 Issue #6215: backport the 3.1 io lib
Antoine Pitrou <solipsis@pitrou.net>
parents: 54279
diff changeset
409 self.assertRaises(ValueError, _FileIO, "/some/invalid/name", "rt")
49677
82ccc7e77ec5 Merged revisions 66801,66803-66804,66813,66854-66856,66866,66870-66872,66874,66887,66903,66905,66911,66913,66927,66932,66938,66942,66962,66964,66973-66974,66977,66992,66998-66999,67002,67005,67007,67028,67040-67041,67044,67070,67089,67091,67101,67117-67119,67123-67124 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48918
diff changeset
410 self.assertEqual(w.warnings, [])
82ccc7e77ec5 Merged revisions 66801,66803-66804,66813,66854-66856,66866,66870-66872,66874,66887,66903,66905,66911,66913,66927,66932,66938,66942,66962,66964,66973-66974,66977,66992,66998-66999,67002,67005,67007,67028,67040-67041,67044,67070,67089,67091,67101,67117-67119,67123-67124 via svnmerge from
Georg Brandl <georg@python.org>
parents: 48918
diff changeset
411
60722
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
412 def test_surrogates(self):
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
413 # Issue #8438: try to open a filename containing surrogates.
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
414 # It should either fail because the file doesn't exist or the filename
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
415 # can't be represented using the filesystem encoding, but not because
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
416 # of a LookupError for the error handler "surrogateescape".
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
417 filename = u'\udc80.txt'
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
418 try:
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
419 with _FileIO(filename):
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
420 pass
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
421 except (UnicodeEncodeError, IOError):
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
422 pass
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
423 # Spawn a separate Python process with a different "file system
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
424 # default encoding", to exercise this further.
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
425 env = dict(os.environ)
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
426 env[b'LC_CTYPE'] = b'C'
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
427 _, out = run_python('-c', 'import _io; _io.FileIO(%r)' % filename, env=env)
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
428 if ('UnicodeEncodeError' not in out and
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
429 'IOError: [Errno 2] No such file or directory' not in out):
4092e4566db3 Issue #8438: Remove reference to the missing "surrogateescape" encoding
Antoine Pitrou <solipsis@pitrou.net>
parents: 59664
diff changeset
430 self.fail('Bad output: %r' % out)
48859
de954dd6797b #3662: Fix segfault introduced when fixing memory leaks.
Neal Norwitz <nnorwitz@gmail.com>
parents: 48016
diff changeset
431
77537
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
432 def testUnclosedFDOnException(self):
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
433 class MyException(Exception): pass
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
434 class MyFileIO(_FileIO):
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
435 def __setattr__(self, name, value):
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
436 if name == "name":
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
437 raise MyException("blocked setting name")
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
438 return super(MyFileIO, self).__setattr__(name, value)
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
439 fd = os.open(__file__, os.O_RDONLY)
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
440 self.assertRaises(MyException, MyFileIO, fd)
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
441 os.close(fd) # should not raise OSError(EBADF)
981ad5254d07 #10053: Don't close FDs when FileIO.__init__ fails
Hynek Schlawack <hs@ox.cx>
parents: 68256
diff changeset
442
48016
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
443 def test_main():
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
444 # Historically, these tests have been sloppy about removing TESTFN.
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
445 # So get rid of it no matter what.
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
446 try:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
447 run_unittest(AutoFileTests, OtherFileTests)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
448 finally:
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
449 if os.path.exists(TESTFN):
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
450 os.unlink(TESTFN)
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
451
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
452 if __name__ == '__main__':
1b20afa48d58 backport test_fileio
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
453 test_main()