[pypy-commit] pypy default: test file mode in rfile
bdkearns
noreply at buildbot.pypy.org
Fri Aug 29 18:59:19 CEST 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r73177:06ebd52f400f
Date: 2014-08-29 12:54 -0400
http://bitbucket.org/pypy/pypy/changeset/06ebd52f400f/
Log: test file mode in rfile
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -137,7 +137,7 @@
c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IOLBF, BUFSIZ)
else:
c_setvbuf(ll_f, lltype.nullptr(rffi.CCHARP.TO), _IOFBF, buffering)
- return RFile(ll_f)
+ return RFile(ll_f, mode)
def create_temp_rfile():
@@ -159,7 +159,7 @@
finally:
lltype.free(ll_mode, flavor='raw')
_dircheck(ll_f)
- return RFile(ll_f)
+ return RFile(ll_f, mode)
def create_popen_file(command, type):
@@ -179,15 +179,33 @@
class RFile(object):
- def __init__(self, ll_file):
+ readable = False
+ writable = False
+
+ def __init__(self, ll_file, mode='+'):
self.ll_file = ll_file
+ if 'r' in mode:
+ self.readable = True
+ if 'w' in mode or 'a' in mode:
+ self.writable = True
+ if '+' in mode:
+ self.readable = self.writable = True
def _check_closed(self):
if not self.ll_file:
raise ValueError("I/O operation on closed file")
+ def _check_reading(self):
+ if not self.readable:
+ raise OSError(0, "File not open for reading")
+
+ def _check_writing(self):
+ if not self.writable:
+ raise OSError(0, "File not open for writing")
+
def write(self, value):
self._check_closed()
+ self._check_writing()
ll_value = rffi.get_nonmovingbuffer(value)
try:
# note that since we got a nonmoving buffer, it is either raw
@@ -224,6 +242,7 @@
def read(self, size=-1):
# XXX CPython uses a more delicate logic here
self._check_closed()
+ self._check_reading()
ll_file = self.ll_file
if size == 0:
return ""
@@ -281,6 +300,7 @@
def truncate(self, arg=-1):
self._check_closed()
+ self._check_writing()
if arg == -1:
arg = self.tell()
self.flush()
@@ -328,6 +348,7 @@
def readline(self, size=-1):
self._check_closed()
+ self._check_reading()
if size == 0:
return ""
elif size < 0:
diff --git a/rpython/rlib/test/test_rfile.py b/rpython/rlib/test/test_rfile.py
--- a/rpython/rlib/test/test_rfile.py
+++ b/rpython/rlib/test/test_rfile.py
@@ -112,10 +112,28 @@
def f():
f = open(fname, "w")
+ try:
+ f.read()
+ except exc as e:
+ assert e.errno == errno
+ else:
+ assert False
+ try:
+ f.readline()
+ except exc as e:
+ assert e.errno == errno
+ else:
+ assert False
f.write("dupa\x00dupb")
f.close()
for mode in ['r', 'U']:
f2 = open(fname, mode)
+ try:
+ f2.write('')
+ except exc as e:
+ assert e.errno == errno
+ else:
+ assert False
dupa = f2.read(0)
assert dupa == ""
dupa = f2.read()
@@ -132,7 +150,9 @@
assert dupa == "dupa\x00dupb"
f2.close()
+ exc = IOError; errno = None
f()
+ exc = OSError; errno = 0
self.interpret(f, [])
def test_read_sequentially(self):
@@ -188,11 +208,19 @@
new_fno = os.dup(f.fileno())
f2 = os.fdopen(new_fno, "w")
f.close()
+ try:
+ f2.read()
+ except exc as e:
+ assert e.errno == errno
+ else:
+ assert False
f2.write("xxx")
f2.close()
+ exc = IOError; errno = None
f()
assert open(fname).read() == "xxx"
+ exc = OSError; errno = 0
self.interpret(f, [])
assert open(fname).read() == "xxx"
@@ -249,8 +277,18 @@
data = f.read()
assert data == "hello w"
f.close()
+ f = open(fname)
+ try:
+ f.truncate()
+ except exc as e:
+ assert e.errno == errno
+ else:
+ assert False
+ f.close()
+ exc = IOError; errno = None
f()
+ exc = OSError; errno = 0
self.interpret(f, [])
More information about the pypy-commit
mailing list