Lib.test.test_io_jy.py Maven / Gradle / Ivy
"""Misc io tests.
Made for Jython.
"""
import unittest
from org.python.core.util import FileUtil
from org.python.core.io import StreamIO
from java.io import InputStream
from java.nio import ByteBuffer;
class InfiniteInputStream(InputStream):
def read(self, *args):
if len(args) == 0:
return ord('x')
elif len(args) == 1:
return InputStream.read(self, args[0])
else:
return self.read_buffer(*args)
def read_buffer(self, buf, off, length):
if length > 0:
buf[off] = ord('x')
return 1
return 0
class IoTestCase(unittest.TestCase):
"""
Jython was failing to read all available content when an InputStream
returns early. Java's InputStream.read() is allowed to return less than the
requested # of bytes under non-exceptional/EOF conditions, whereas
(for example) wsgi.input requires the file.read() method to block until the
requested # of bytes are available (except for exceptional/EOF conditions).
See http://bugs.jython.org/issue1754 for more discussion.
"""
def test_infinite_input(self):
iis = InfiniteInputStream()
f = FileUtil.wrap(iis, 'rb')
size = 10000
self.assertEqual(len(f.read(size)), size)
self.assertEqual(len(f.read(size)), size)
self.assertEqual(len(f.read(size)), size)
def test_buffer_no_array(self):
"""
Directly tests StreamIO with and without a backing array and an
InputStream that returns early.
"""
size = 10000
without_array = ByteBuffer.allocateDirect(size)
self.assertFalse(without_array.hasArray())
with_array = ByteBuffer.allocate(size)
self.assertTrue(with_array.hasArray())
bbs = [with_array, without_array]
for bb in bbs:
iis = InfiniteInputStream()
io = StreamIO(iis, True)
self.assertEqual(io.readinto(bb), size)
if __name__ == '__main__':
unittest.main()
© 2015 - 2025 Weber Informatics LLC | Privacy Policy