Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: stdlib-2.7.3
Changeset: r55683:c083bcc614c0
Date: 2012-06-15 08:50 +0200
http://bitbucket.org/pypy/pypy/changeset/c083bcc614c0/

Log:    Test and fix for the nonblocking write.

diff --git a/pypy/module/_io/interp_bufferedio.py 
b/pypy/module/_io/interp_bufferedio.py
--- a/pypy/module/_io/interp_bufferedio.py
+++ b/pypy/module/_io/interp_bufferedio.py
@@ -692,11 +692,13 @@
                     for i in range(size):
                         self.buffer[self.write_end + i] = data[i]
                     self.write_end += size
+                    self.pos += size
                     return space.wrap(size)
                 # Buffer as much as possible
                 for i in range(available):
                     self.buffer[self.write_end + i] = data[i]
                 self.write_end += available
+                self.pos += available
                 # Modifying the existing exception will will change
                 # e.characters_written but not e.args[2].  Therefore
                 # we just replace with a new error.
diff --git a/pypy/module/_io/test/test_bufferedio.py 
b/pypy/module/_io/test/test_bufferedio.py
--- a/pypy/module/_io/test/test_bufferedio.py
+++ b/pypy/module/_io/test/test_bufferedio.py
@@ -1,3 +1,4 @@
+from __future__ import with_statement
 from pypy.conftest import gettestobjspace, option
 from pypy.interpreter.gateway import interp2app
 from pypy.tool.udir import udir
@@ -372,6 +373,69 @@
         # Previously buffered bytes were flushed
         assert s.startswith("01234567A")
 
+    def test_nonblock_pipe_write_bigbuf(self):
+        self.test_nonblock_pipe_write(16*1024)
+
+    def test_nonblock_pipe_write_smallbuf(self):
+        self.test_nonblock_pipe_write(1024)
+
+    def w_test_nonblock_pipe_write(self, bufsize):
+        import io
+        class NonBlockingPipe(io.BufferedIOBase):
+            "write() returns None when buffer is full"
+            def __init__(self, buffersize=4096):
+                self.buffersize = buffersize
+                self.buffer = b''
+            def readable(self): return True
+            def writable(self): return True
+
+            def write(self, data):
+                available = self.buffersize - len(self.buffer)
+                if available <= 0:
+                    return None
+                self.buffer += data[:available]
+                return min(len(data), available)
+            def read(self, size=-1):
+                if not self.buffer:
+                    return None
+                if size == -1:
+                    size = len(self.buffer)
+                data = self.buffer[:size]
+                self.buffer = self.buffer[size:]
+                return data
+
+        sent = []
+        received = []
+        pipe = NonBlockingPipe()
+        rf = io.BufferedReader(pipe, bufsize)
+        wf = io.BufferedWriter(pipe, bufsize)
+
+        for N in 9999, 7574:
+            try:
+                i = 0
+                while True:
+                    msg = chr(i % 26 + 97) * N
+                    sent.append(msg)
+                    wf.write(msg)
+                    i += 1
+            except io.BlockingIOError as e:
+                sent[-1] = sent[-1][:e.characters_written]
+                received.append(rf.read())
+                msg = b'BLOCKED'
+                wf.write(msg)
+                sent.append(msg)
+        while True:
+            try:
+                wf.flush()
+                break
+            except io.BlockingIOError as e:
+                received.append(rf.read())
+        received += iter(rf.read, None)
+        rf.close()
+        wf.close()
+        sent, received = b''.join(sent), b''.join(received)
+        assert sent == received
+
     def test_read_non_blocking(self):
         import _io
         class MockRawIO(_io._RawIOBase):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to