2009-06-26 14:10:20 +09:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# coding: utf-8
|
|
|
|
|
2014-02-15 22:16:01 +09:00
|
|
|
import io
|
2012-07-20 02:02:37 +09:00
|
|
|
from msgpack import Unpacker, BufferFull
|
2017-04-29 19:33:20 +02:00
|
|
|
from msgpack import pack
|
2013-10-20 23:06:02 +09:00
|
|
|
from msgpack.exceptions import OutOfData
|
2012-12-29 11:24:25 +09:00
|
|
|
from pytest import raises
|
|
|
|
|
2009-06-26 14:10:20 +09:00
|
|
|
|
2013-01-29 02:58:26 +01:00
|
|
|
def test_partialdata():
|
|
|
|
unpacker = Unpacker()
|
|
|
|
unpacker.feed(b'\xa5')
|
|
|
|
with raises(StopIteration): next(iter(unpacker))
|
|
|
|
unpacker.feed(b'h')
|
|
|
|
with raises(StopIteration): next(iter(unpacker))
|
|
|
|
unpacker.feed(b'a')
|
|
|
|
with raises(StopIteration): next(iter(unpacker))
|
|
|
|
unpacker.feed(b'l')
|
|
|
|
with raises(StopIteration): next(iter(unpacker))
|
|
|
|
unpacker.feed(b'l')
|
|
|
|
with raises(StopIteration): next(iter(unpacker))
|
|
|
|
unpacker.feed(b'o')
|
2013-01-29 03:03:13 +01:00
|
|
|
assert next(iter(unpacker)) == b'hallo'
|
2013-01-29 02:58:26 +01:00
|
|
|
|
2009-06-26 14:10:20 +09:00
|
|
|
def test_foobar():
|
2012-09-24 02:12:55 +09:00
|
|
|
unpacker = Unpacker(read_size=3, use_list=1)
|
2012-06-19 13:55:14 +09:00
|
|
|
unpacker.feed(b'foobar')
|
|
|
|
assert unpacker.unpack() == ord(b'f')
|
|
|
|
assert unpacker.unpack() == ord(b'o')
|
|
|
|
assert unpacker.unpack() == ord(b'o')
|
|
|
|
assert unpacker.unpack() == ord(b'b')
|
|
|
|
assert unpacker.unpack() == ord(b'a')
|
|
|
|
assert unpacker.unpack() == ord(b'r')
|
2012-12-29 11:24:25 +09:00
|
|
|
with raises(OutOfData):
|
|
|
|
unpacker.unpack()
|
2012-06-19 14:20:56 +09:00
|
|
|
|
2012-06-19 13:55:14 +09:00
|
|
|
unpacker.feed(b'foo')
|
|
|
|
unpacker.feed(b'bar')
|
2009-06-26 14:10:20 +09:00
|
|
|
|
|
|
|
k = 0
|
2012-06-19 14:20:56 +09:00
|
|
|
for o, e in zip(unpacker, 'foobarbaz'):
|
|
|
|
assert o == ord(e)
|
2009-06-26 14:10:20 +09:00
|
|
|
k += 1
|
2012-06-19 13:55:14 +09:00
|
|
|
assert k == len(b'foobar')
|
2009-06-26 14:10:20 +09:00
|
|
|
|
2012-09-23 10:09:51 +09:00
|
|
|
def test_foobar_skip():
|
2012-09-24 02:12:55 +09:00
|
|
|
unpacker = Unpacker(read_size=3, use_list=1)
|
2012-09-23 10:09:51 +09:00
|
|
|
unpacker.feed(b'foobar')
|
|
|
|
assert unpacker.unpack() == ord(b'f')
|
|
|
|
unpacker.skip()
|
|
|
|
assert unpacker.unpack() == ord(b'o')
|
|
|
|
unpacker.skip()
|
|
|
|
assert unpacker.unpack() == ord(b'a')
|
|
|
|
unpacker.skip()
|
2012-12-29 11:24:25 +09:00
|
|
|
with raises(OutOfData):
|
|
|
|
unpacker.unpack()
|
2009-06-26 14:10:20 +09:00
|
|
|
|
2012-07-20 02:02:37 +09:00
|
|
|
def test_maxbuffersize():
|
2012-12-29 11:24:25 +09:00
|
|
|
with raises(ValueError):
|
|
|
|
Unpacker(read_size=5, max_buffer_size=3)
|
2012-09-24 02:12:55 +09:00
|
|
|
unpacker = Unpacker(read_size=3, max_buffer_size=3, use_list=1)
|
2012-07-20 02:02:37 +09:00
|
|
|
unpacker.feed(b'fo')
|
2012-12-29 11:24:25 +09:00
|
|
|
with raises(BufferFull):
|
|
|
|
unpacker.feed(b'ob')
|
2012-07-20 02:02:37 +09:00
|
|
|
unpacker.feed(b'o')
|
|
|
|
assert ord('f') == next(unpacker)
|
|
|
|
unpacker.feed(b'b')
|
|
|
|
assert ord('o') == next(unpacker)
|
|
|
|
assert ord('o') == next(unpacker)
|
|
|
|
assert ord('b') == next(unpacker)
|
|
|
|
|
|
|
|
|
2012-09-23 11:13:44 +10:00
|
|
|
def test_readbytes():
|
|
|
|
unpacker = Unpacker(read_size=3)
|
|
|
|
unpacker.feed(b'foobar')
|
|
|
|
assert unpacker.unpack() == ord(b'f')
|
|
|
|
assert unpacker.read_bytes(3) == b'oob'
|
|
|
|
assert unpacker.unpack() == ord(b'a')
|
|
|
|
assert unpacker.unpack() == ord(b'r')
|
|
|
|
|
|
|
|
# Test buffer refill
|
2014-02-15 22:16:01 +09:00
|
|
|
unpacker = Unpacker(io.BytesIO(b'foobar'), read_size=3)
|
2012-09-23 11:13:44 +10:00
|
|
|
assert unpacker.unpack() == ord(b'f')
|
|
|
|
assert unpacker.read_bytes(3) == b'oob'
|
|
|
|
assert unpacker.unpack() == ord(b'a')
|
|
|
|
assert unpacker.unpack() == ord(b'r')
|
2015-01-26 20:31:03 +01:00
|
|
|
|
|
|
|
def test_issue124():
|
|
|
|
unpacker = Unpacker()
|
2015-01-26 20:55:23 +01:00
|
|
|
unpacker.feed(b'\xa1?\xa1!')
|
|
|
|
assert tuple(unpacker) == (b'?', b'!')
|
2015-01-26 20:31:03 +01:00
|
|
|
assert tuple(unpacker) == ()
|
2015-01-26 20:55:23 +01:00
|
|
|
unpacker.feed(b"\xa1?\xa1")
|
|
|
|
assert tuple(unpacker) == (b'?',)
|
2015-01-26 20:31:03 +01:00
|
|
|
assert tuple(unpacker) == ()
|
2015-01-26 20:55:23 +01:00
|
|
|
unpacker.feed(b"!")
|
|
|
|
assert tuple(unpacker) == (b'!',)
|
2015-01-26 20:31:03 +01:00
|
|
|
assert tuple(unpacker) == ()
|
2017-04-29 19:33:20 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_unpack_tell():
|
|
|
|
stream = io.BytesIO()
|
|
|
|
messages = [2**i-1 for i in range(65)]
|
|
|
|
messages += [-(2**i) for i in range(1, 64)]
|
|
|
|
messages += [b'hello', b'hello'*1000, list(range(20)),
|
|
|
|
{i: bytes(i)*i for i in range(10)},
|
|
|
|
{i: bytes(i)*i for i in range(32)}]
|
|
|
|
offsets = []
|
|
|
|
for m in messages:
|
|
|
|
pack(m, stream)
|
|
|
|
offsets.append(stream.tell())
|
|
|
|
stream.seek(0)
|
|
|
|
unpacker = Unpacker(stream)
|
|
|
|
for m, o in zip(messages, offsets):
|
|
|
|
m2 = next(unpacker)
|
|
|
|
assert m == m2
|
|
|
|
assert o == unpacker.tell()
|