1
# Adapted from test_file.py by Daniel Stutzbach
2
#from __future__ import unicode_literals
7
from array import array
8
from weakref import proxy
10
from test.test_support import TESTFN, findfile, run_unittest
11
from UserList import UserList
15
class AutoFileTests(unittest.TestCase):
16
# file tests for which a test file is automatically set up
19
self.f = _fileio._FileIO(TESTFN, 'w')
26
def testWeakRefs(self):
27
# verify weak references
29
p.write(bytes(range(10)))
30
self.assertEquals(self.f.tell(), p.tell())
33
self.assertRaises(ReferenceError, getattr, p, 'tell')
35
def testSeekTell(self):
36
self.f.write(bytes(bytearray(range(20))))
37
self.assertEquals(self.f.tell(), 20)
39
self.assertEquals(self.f.tell(), 0)
41
self.assertEquals(self.f.tell(), 10)
43
self.assertEquals(self.f.tell(), 15)
45
self.assertEquals(self.f.tell(), 10)
47
self.assertEquals(self.f.tell(), 15)
49
def testAttributes(self):
50
# verify expected attributes exist
53
self.assertEquals(f.mode, "w")
54
self.assertEquals(f.closed, False)
56
# verify the attributes are readonly
57
for attr in 'mode', 'closed':
58
self.assertRaises((AttributeError, TypeError),
59
setattr, f, attr, 'oops')
61
def testReadinto(self):
63
self.f.write(bytes(bytearray([1, 2])))
65
a = array('b', b'x'*10)
66
self.f = _fileio._FileIO(TESTFN, 'r')
67
n = self.f.readinto(a)
68
self.assertEquals(array('b', [1, 2]), a[:n])
71
self.assertEquals(repr(self.f),
72
"_fileio._FileIO(%d, %s)" % (self.f.fileno(),
77
self.assert_(not f.isatty())
78
self.assert_(not f.closed)
79
#self.assertEquals(f.name, TESTFN)
80
self.assertRaises(ValueError, f.read, 10) # Open for reading
82
self.assert_(f.closed)
83
f = _fileio._FileIO(TESTFN, 'r')
84
self.assertRaises(TypeError, f.readinto, "")
85
self.assert_(not f.closed)
87
self.assert_(f.closed)
89
def testMethods(self):
90
methods = ['fileno', 'isatty', 'read', 'readinto',
91
'seek', 'tell', 'truncate', 'write', 'seekable',
92
'readable', 'writable']
93
if sys.platform.startswith('atheos'):
94
methods.remove('truncate')
97
self.assert_(self.f.closed)
99
for methodname in methods:
100
method = getattr(self.f, methodname)
101
# should raise on closed file
102
self.assertRaises(ValueError, method)
104
def testOpendir(self):
105
# Issue 3703: opening a directory should fill the errno
106
# Windows always returns "[Errno 13]: Permission denied
107
# Unix calls dircheck() and returns "[Errno 21]: Is a directory"
109
_fileio._FileIO('.', 'r')
111
self.assertNotEqual(e.errno, 0)
113
self.fail("Should have raised IOError")
116
class OtherFileTests(unittest.TestCase):
120
f = _fileio._FileIO(TESTFN, "w")
121
self.assertEquals(f.readable(), False)
122
self.assertEquals(f.writable(), True)
123
self.assertEquals(f.seekable(), True)
126
f = _fileio._FileIO(TESTFN, "r")
127
self.assertEquals(f.readable(), True)
128
self.assertEquals(f.writable(), False)
129
self.assertEquals(f.seekable(), True)
132
f = _fileio._FileIO(TESTFN, "a+")
133
self.assertEquals(f.readable(), True)
134
self.assertEquals(f.writable(), True)
135
self.assertEquals(f.seekable(), True)
136
self.assertEquals(f.isatty(), False)
139
if sys.platform != "win32":
141
f = _fileio._FileIO("/dev/tty", "a")
142
except EnvironmentError:
143
# When run in a cron job there just aren't any
144
# ttys, so skip the test. This also handles other
145
# OS'es that don't support /dev/tty.
148
f = _fileio._FileIO("/dev/tty", "a")
149
self.assertEquals(f.readable(), False)
150
self.assertEquals(f.writable(), True)
151
if sys.platform != "darwin" and \
152
not sys.platform.startswith('freebsd') and \
153
not sys.platform.startswith('sunos'):
154
# Somehow /dev/tty appears seekable on some BSDs
155
self.assertEquals(f.seekable(), False)
156
self.assertEquals(f.isatty(), True)
161
def testModeStrings(self):
162
# check invalid mode strings
163
for mode in ("", "aU", "wU+", "rb", "rt"):
165
f = _fileio._FileIO(TESTFN, mode)
170
self.fail('%r is an invalid file mode' % mode)
172
def testUnicodeOpen(self):
173
# verify repr works for unicode too
174
f = _fileio._FileIO(str(TESTFN), "w")
178
def testBadModeArgument(self):
179
# verify that we get a sensible error message for bad mode argument
182
f = _fileio._FileIO(TESTFN, bad_mode)
183
except ValueError as msg:
186
if s.find(TESTFN) != -1 or s.find(bad_mode) == -1:
187
self.fail("bad error message for invalid mode: %s" % s)
188
# if msg.args[0] == 0, we're probably on Windows where there may be
189
# no obvious way to discover why open() failed.
192
self.fail("no error for invalid mode: %s" % bad_mode)
194
def testTruncateOnWindows(self):
196
# SF bug <http://www.python.org/sf/801631>
197
# "file.truncate fault on windows"
198
f = _fileio._FileIO(TESTFN, 'w')
199
f.write(bytes(bytearray(range(11))))
202
f = _fileio._FileIO(TESTFN,'r+')
204
if data != bytes(bytearray(range(5))):
205
self.fail("Read on file opened for update failed %r" % data)
207
self.fail("File pos after read wrong %d" % f.tell())
211
self.fail("File pos after ftruncate wrong %d" % f.tell())
214
size = os.path.getsize(TESTFN)
216
self.fail("File size after ftruncate wrong %d" % size)
223
def testAppend(self):
225
f = open(TESTFN, 'wb')
228
f = open(TESTFN, 'ab')
231
f = open(TESTFN, 'rb')
234
self.assertEqual(d, b'spameggs')
241
def testInvalidInit(self):
242
self.assertRaises(TypeError, _fileio._FileIO, "1", 0, 0)
246
# Historically, these tests have been sloppy about removing TESTFN.
247
# So get rid of it no matter what.
249
run_unittest(AutoFileTests, OtherFileTests)
251
if os.path.exists(TESTFN):
254
if __name__ == '__main__':