[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