def test_never_return_more_than_asked_for(self): """read should never return more bytes than it is asked for.""" stream = io.BytesIO(b"0" * io.DEFAULT_BUFFER_SIZE * 2) reader = smart_open.S3ReadStreamInner(stream) logger.debug("reader: %r", reader) logger.debug("performing partial read") ret = reader.read(io.DEFAULT_BUFFER_SIZE // 2) self.assertEquals(len(ret), io.DEFAULT_BUFFER_SIZE // 2) # # Currently, the reader's buffer is half-full wrt DEFAULT_BUFFER_SIZE. # Force it to read more bytes from the stream, causing it to contain # 1.5 * DEFAULT_BUFFER_SIZE bytes, and reaching EOF. The bug is that # once it reaches EOF, it always returns the buffer contents, ignoring # how many bytes it was originally asked for. # ret = reader.read(io.DEFAULT_BUFFER_SIZE) self.assertEquals(len(ret), io.DEFAULT_BUFFER_SIZE) # # Consume the rest of the file. # self.assertEquals(len(reader.read()), io.DEFAULT_BUFFER_SIZE // 2)
def test_buffer_flushed_after_eof(self): """The buffer should be empty after we've requested to read until EOF.""" stream = io.BytesIO(b"0" * io.DEFAULT_BUFFER_SIZE * 2) reader = smart_open.S3ReadStreamInner(stream) self.assertEquals(len(reader.read(io.DEFAULT_BUFFER_SIZE)), io.DEFAULT_BUFFER_SIZE) self.assertEquals(len(reader.read()), io.DEFAULT_BUFFER_SIZE) self.assertEquals(len(reader.unused_buffer), 0) self.assertEquals(len(reader.read()), 0)