[pypy-commit] pypy py3.5: Add a failing test for the issue that prevents pip from working on pypy3 nightly

rlamy pypy.commits at gmail.com
Sat Dec 3 00:57:53 EST 2016


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: py3.5
Changeset: r88835:a92e564e1432
Date: 2016-12-03 05:57 +0000
http://bitbucket.org/pypy/pypy/changeset/a92e564e1432/

Log:	Add a failing test for the issue that prevents pip from working on
	pypy3 nightly

	Since it doesn't seem to fit in any of the existing test categories,
	I'm putting it in a new top-level directory, 'extra_tests/'.

diff --git a/extra_tests/README.txt b/extra_tests/README.txt
new file mode 100644
--- /dev/null
+++ b/extra_tests/README.txt
@@ -0,0 +1,5 @@
+The tests in this directory are a complement to lib-python/3/test/.
+
+They are meant to run on top of a compiled pypy3 or CPython3.5 in an
+environment containing at least pytest and hypothesis, using a command like
+'pytest extra_tests/'.
diff --git a/extra_tests/pytest.ini b/extra_tests/pytest.ini
new file mode 100644
diff --git a/extra_tests/test_bufferedreader.py b/extra_tests/test_bufferedreader.py
new file mode 100644
--- /dev/null
+++ b/extra_tests/test_bufferedreader.py
@@ -0,0 +1,99 @@
+import io
+from cffi import FFI
+
+import pytest
+from hypothesis import strategies as st
+from hypothesis import given, assume, settings
+from hypothesis.stateful import (
+    RuleBasedStateMachine, Bundle, rule, run_state_machine_as_test, precondition)
+ffi = FFI()
+
+MAX_READ_SIZE = 1024
+MIN_READ_SIZE = 1
+MAX_SIZE = 0xffff
+
+ at st.composite
+def data_and_sizes(draw, reads=st.lists(st.integers(MIN_READ_SIZE, MAX_READ_SIZE))):
+    reads = draw(reads)
+    total_size = sum(reads)
+    assume(0 < total_size < MAX_SIZE)
+    data = draw(st.binary(min_size=total_size, max_size=total_size))
+    return data, reads
+
+class Stream(io.RawIOBase):
+    def __init__(self, data, read_sizes):
+        assert sum(read_sizes) == len(data)
+        self.data = data
+        self.n = 0
+        self.read_sizes = iter(read_sizes)
+        self.partial_read = 0
+
+    def readinto(self, buf):
+        if self.n == len(self.data):
+            return 0
+        if self.partial_read:
+            read_size = self.partial_read
+        else:
+            read_size = next(self.read_sizes)
+        if len(buf) < read_size:
+            self.partial_read = read_size - len(buf)
+            read_size = len(buf)
+        else:
+            self.partial_read = 0
+        self.update_buffer(buf, self.data[self.n:self.n + read_size])
+        self.n += read_size
+        return read_size
+
+    def update_buffer(self, buf, data):
+        n = len(data)
+        buf[:n] = data
+
+    def readable(self):
+        return True
+
+class StreamCFFI(Stream):
+    def update_buffer(self, buf, data):
+        n = len(data)
+        ffi.buffer(ffi.from_buffer(buf), n)[:] = data
+
+
+ at pytest.mark.parametrize('StreamCls', [Stream, StreamCFFI])
+ at given(params=data_and_sizes(), chunk_size=st.integers(MIN_READ_SIZE, 8192))
+def test_buf(params, chunk_size, StreamCls):
+    data, sizes = params
+    stream = StreamCls(data, sizes)
+    assert io.BufferedReader(stream, chunk_size).read(len(data)) == data
+
+class StateMachine(RuleBasedStateMachine):
+    def __init__(self, stream, reference):
+        super().__init__()
+        self.stream = stream
+        self.reference = reference
+
+    @rule(size=st.integers(MIN_READ_SIZE, MAX_READ_SIZE))
+    def read(self, size):
+        expected = self.reference.read(size)
+        assert self.stream.read(size) == expected
+
+    @rule(size=st.integers(MIN_READ_SIZE, MAX_READ_SIZE))
+    def readinto(self, size):
+        expected = self.reference.read(size)
+        buf = bytearray(size)
+        n = self.stream.readinto(buf)
+        assert buf[:n] == expected
+
+    @rule()
+    def readline(self):
+        expected = self.reference.readline(80)
+        assert self.stream.readline(80) == expected
+
+ at pytest.mark.parametrize('StreamCls', [Stream, StreamCFFI])
+ at settings(max_examples=50)
+ at given(params=data_and_sizes(), chunk_size=st.integers(MIN_READ_SIZE, 8192))
+def test_stateful(params, chunk_size, StreamCls):
+    data, sizes = params
+    raw_stream = StreamCls(data, sizes)
+    reference = io.BytesIO(data)
+    stream = io.BufferedReader(raw_stream, chunk_size)
+    sm = StateMachine(stream, reference)
+    run_state_machine_as_test(lambda: sm)


More information about the pypy-commit mailing list