mirror of
https://github.com/python/cpython.git
synced 2026-05-14 16:38:19 -04:00
a716eabca7
(calling ftell(stdin) doesn't seem defined). So we won't test errors from ftell unless we can do it portably.
231 lines
5.3 KiB
Python
231 lines
5.3 KiB
Python
import sys
|
|
import os
|
|
from array import array
|
|
from weakref import proxy
|
|
|
|
from test.test_support import verify, TESTFN, TestFailed
|
|
from UserList import UserList
|
|
|
|
# verify weak references
|
|
f = file(TESTFN, 'w')
|
|
p = proxy(f)
|
|
p.write('teststring')
|
|
verify(f.tell(), p.tell())
|
|
f.close()
|
|
f = None
|
|
try:
|
|
p.tell()
|
|
except ReferenceError:
|
|
pass
|
|
else:
|
|
raise TestFailed('file proxy still exists when the file is gone')
|
|
|
|
# verify expected attributes exist
|
|
f = file(TESTFN, 'w')
|
|
softspace = f.softspace
|
|
f.name # merely shouldn't blow up
|
|
f.mode # ditto
|
|
f.closed # ditto
|
|
|
|
# verify softspace is writable
|
|
f.softspace = softspace # merely shouldn't blow up
|
|
|
|
# verify the others aren't
|
|
for attr in 'name', 'mode', 'closed':
|
|
try:
|
|
setattr(f, attr, 'oops')
|
|
except (AttributeError, TypeError):
|
|
pass
|
|
else:
|
|
raise TestFailed('expected exception setting file attr %r' % attr)
|
|
f.close()
|
|
|
|
# check invalid mode strings
|
|
for mode in ("", "aU", "wU+"):
|
|
try:
|
|
f = file(TESTFN, mode)
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
f.close()
|
|
raise TestFailed('%r is an invalid file mode' % mode)
|
|
|
|
# verify writelines with instance sequence
|
|
l = UserList(['1', '2'])
|
|
f = open(TESTFN, 'wb')
|
|
f.writelines(l)
|
|
f.close()
|
|
f = open(TESTFN, 'rb')
|
|
buf = f.read()
|
|
f.close()
|
|
verify(buf == '12')
|
|
|
|
# verify readinto
|
|
a = array('c', 'x'*10)
|
|
f = open(TESTFN, 'rb')
|
|
n = f.readinto(a)
|
|
f.close()
|
|
verify(buf == a.tostring()[:n])
|
|
|
|
# verify writelines with integers
|
|
f = open(TESTFN, 'wb')
|
|
try:
|
|
f.writelines([1, 2, 3])
|
|
except TypeError:
|
|
pass
|
|
else:
|
|
print "writelines accepted sequence of integers"
|
|
f.close()
|
|
|
|
# verify writelines with integers in UserList
|
|
f = open(TESTFN, 'wb')
|
|
l = UserList([1,2,3])
|
|
try:
|
|
f.writelines(l)
|
|
except TypeError:
|
|
pass
|
|
else:
|
|
print "writelines accepted sequence of integers"
|
|
f.close()
|
|
|
|
# verify writelines with non-string object
|
|
class NonString: pass
|
|
|
|
f = open(TESTFN, 'wb')
|
|
try:
|
|
f.writelines([NonString(), NonString()])
|
|
except TypeError:
|
|
pass
|
|
else:
|
|
print "writelines accepted sequence of non-string objects"
|
|
f.close()
|
|
|
|
try:
|
|
sys.stdin.seek(-1)
|
|
except IOError:
|
|
pass
|
|
else:
|
|
print "should not be able to seek on sys.stdin"
|
|
|
|
try:
|
|
sys.stdin.truncate()
|
|
except IOError:
|
|
pass
|
|
else:
|
|
print "should not be able to truncate on sys.stdin"
|
|
|
|
# verify repr works
|
|
f = open(TESTFN)
|
|
if not repr(f).startswith("<open file '" + TESTFN):
|
|
print "repr(file) failed"
|
|
f.close()
|
|
|
|
# verify repr works for unicode too
|
|
f = open(unicode(TESTFN))
|
|
if not repr(f).startswith("<open file u'" + TESTFN):
|
|
print "repr(file with unicode name) failed"
|
|
f.close()
|
|
|
|
# verify that we get a sensible error message for bad mode argument
|
|
bad_mode = "qwerty"
|
|
try:
|
|
open(TESTFN, bad_mode)
|
|
except IOError, msg:
|
|
if msg[0] != 0:
|
|
s = str(msg)
|
|
if s.find(TESTFN) != -1 or s.find(bad_mode) == -1:
|
|
print "bad error message for invalid mode: %s" % s
|
|
# if msg[0] == 0, we're probably on Windows where there may be
|
|
# no obvious way to discover why open() failed.
|
|
else:
|
|
print "no error for invalid mode: %s" % bad_mode
|
|
|
|
f = open(TESTFN)
|
|
if f.name != TESTFN:
|
|
raise TestFailed, 'file.name should be "%s"' % TESTFN
|
|
if f.isatty():
|
|
raise TestFailed, 'file.isatty() should be false'
|
|
|
|
if f.closed:
|
|
raise TestFailed, 'file.closed should be false'
|
|
|
|
try:
|
|
f.readinto("")
|
|
except TypeError:
|
|
pass
|
|
else:
|
|
raise TestFailed, 'file.readinto("") should raise a TypeError'
|
|
|
|
f.close()
|
|
if not f.closed:
|
|
raise TestFailed, 'file.closed should be true'
|
|
|
|
# make sure that explicitly setting the buffer size doesn't cause
|
|
# misbehaviour especially with repeated close() calls
|
|
for s in (-1, 0, 1, 512):
|
|
try:
|
|
f = open(TESTFN, 'w', s)
|
|
f.write(str(s))
|
|
f.close()
|
|
f.close()
|
|
f = open(TESTFN, 'r', s)
|
|
d = int(f.read())
|
|
f.close()
|
|
f.close()
|
|
except IOError, msg:
|
|
raise TestFailed, 'error setting buffer size %d: %s' % (s, str(msg))
|
|
if d != s:
|
|
raise TestFailed, 'readback failure using buffer size %d'
|
|
|
|
methods = ['fileno', 'flush', 'isatty', 'next', 'read', 'readinto',
|
|
'readline', 'readlines', 'seek', 'tell', 'truncate', 'write',
|
|
'xreadlines', '__iter__']
|
|
if sys.platform.startswith('atheos'):
|
|
methods.remove('truncate')
|
|
|
|
for methodname in methods:
|
|
method = getattr(f, methodname)
|
|
try:
|
|
method()
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
raise TestFailed, 'file.%s() on a closed file should raise a ValueError' % methodname
|
|
|
|
try:
|
|
f.writelines([])
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
raise TestFailed, 'file.writelines([]) on a closed file should raise a ValueError'
|
|
|
|
os.unlink(TESTFN)
|
|
|
|
def bug801631():
|
|
# SF bug <http://www.python.org/sf/801631>
|
|
# "file.truncate fault on windows"
|
|
f = file(TESTFN, 'wb')
|
|
f.write('12345678901') # 11 bytes
|
|
f.close()
|
|
|
|
f = file(TESTFN,'rb+')
|
|
data = f.read(5)
|
|
if data != '12345':
|
|
raise TestFailed("Read on file opened for update failed %r" % data)
|
|
if f.tell() != 5:
|
|
raise TestFailed("File pos after read wrong %d" % f.tell())
|
|
|
|
f.truncate()
|
|
if f.tell() != 5:
|
|
raise TestFailed("File pos after ftruncate wrong %d" % f.tell())
|
|
|
|
f.close()
|
|
size = os.path.getsize(TESTFN)
|
|
if size != 5:
|
|
raise TestFailed("File size after ftruncate wrong %d" % size)
|
|
|
|
try:
|
|
bug801631()
|
|
finally:
|
|
os.unlink(TESTFN)
|