1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
# coding=utf-8
from unittest import *
import hiredis
import sys
class ReaderTest(TestCase):
def setUp(self):
self.reader = hiredis.Reader()
def reply(self):
return self.reader.gets()
def test_nothing(self):
self.assertEquals(False, self.reply())
def test_error_when_feeding_non_string(self):
self.assertRaises(TypeError, self.reader.feed, 1)
def test_protocol_error(self):
self.reader.feed(b"x")
self.assertRaises(hiredis.ProtocolError, self.reply)
def test_protocol_error_with_custom_class(self):
self.reader = hiredis.Reader(protocolError=RuntimeError)
self.reader.feed(b"x")
self.assertRaises(RuntimeError, self.reply)
def test_protocol_error_with_custom_callable(self):
class CustomException(Exception):
pass
self.reader = hiredis.Reader(protocolError=lambda e: CustomException(e))
self.reader.feed(b"x")
self.assertRaises(CustomException, self.reply)
def test_fail_with_wrong_protocol_error_class(self):
self.assertRaises(TypeError, hiredis.Reader, protocolError="wrong")
def test_error_string(self):
self.reader.feed(b"-error\r\n")
error = self.reply()
self.assertEquals(hiredis.ReplyError, type(error))
self.assertEquals(("error",), error.args)
def test_error_string_with_custom_class(self):
self.reader = hiredis.Reader(replyError=RuntimeError)
self.reader.feed(b"-error\r\n")
error = self.reply()
self.assertEquals(RuntimeError, type(error))
self.assertEquals(("error",), error.args)
def test_error_string_with_custom_callable(self):
class CustomException(Exception):
pass
self.reader = hiredis.Reader(replyError=lambda e: CustomException(e))
self.reader.feed(b"-error\r\n")
error = self.reply()
self.assertEquals(CustomException, type(error))
self.assertEquals(("error",), error.args)
def test_fail_with_wrong_reply_error_class(self):
self.assertRaises(TypeError, hiredis.Reader, replyError="wrong")
def test_errors_in_nested_multi_bulk(self):
self.reader.feed(b"*2\r\n-err0\r\n-err1\r\n")
for r, error in zip(("err0", "err1"), self.reply()):
self.assertEquals(hiredis.ReplyError, type(error))
self.assertEquals((r,), error.args)
def test_integer(self):
value = 2**63-1 # Largest 64-bit signed integer
self.reader.feed((":%d\r\n" % value).encode("ascii"))
self.assertEquals(value, self.reply())
def test_status_string(self):
self.reader.feed(b"+ok\r\n")
self.assertEquals(b"ok", self.reply())
def test_empty_bulk_string(self):
self.reader.feed(b"$0\r\n\r\n")
self.assertEquals(b"", self.reply())
def test_bulk_string(self):
self.reader.feed(b"$5\r\nhello\r\n")
self.assertEquals(b"hello", self.reply())
def test_bulk_string_without_encoding(self):
snowman = b"\xe2\x98\x83"
self.reader.feed(b"$3\r\n" + snowman + b"\r\n")
self.assertEquals(snowman, self.reply())
def test_bulk_string_with_encoding(self):
snowman = b"\xe2\x98\x83"
self.reader = hiredis.Reader(encoding="utf-8")
self.reader.feed(b"$3\r\n" + snowman + b"\r\n")
self.assertEquals(snowman.decode("utf-8"), self.reply())
def test_bulk_string_with_other_encoding(self):
snowman = b"\xe2\x98\x83"
self.reader = hiredis.Reader(encoding="utf-32")
self.reader.feed(b"$3\r\n" + snowman + b"\r\n")
self.assertEquals(snowman, self.reply())
def test_bulk_string_with_invalid_encoding(self):
self.reader = hiredis.Reader(encoding="unknown")
self.reader.feed(b"$5\r\nhello\r\n")
self.assertRaises(LookupError, self.reply)
def test_null_multi_bulk(self):
self.reader.feed(b"*-1\r\n")
self.assertEquals(None, self.reply())
def test_empty_multi_bulk(self):
self.reader.feed(b"*0\r\n")
self.assertEquals([], self.reply())
def test_multi_bulk(self):
self.reader.feed(b"*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n")
self.assertEquals([b"hello", b"world"], self.reply())
def test_multi_bulk_with_invalid_encoding_and_partial_reply(self):
self.reader = hiredis.Reader(encoding="unknown")
self.reader.feed(b"*2\r\n$5\r\nhello\r\n")
self.assertEquals(False, self.reply())
self.reader.feed(b":1\r\n")
self.assertRaises(LookupError, self.reply)
def test_nested_multi_bulk(self):
self.reader.feed(b"*2\r\n*2\r\n$5\r\nhello\r\n$5\r\nworld\r\n$1\r\n!\r\n")
self.assertEquals([[b"hello", b"world"], b"!"], self.reply())
def test_nested_multi_bulk_depth(self):
self.reader.feed(b"*1\r\n*1\r\n*1\r\n*1\r\n$1\r\n!\r\n")
self.assertEquals([[[[b"!"]]]], self.reply())
def test_subclassable(self):
class TestReader(hiredis.Reader):
def __init__(self, *args, **kwargs):
super(TestReader, self).__init__(*args, **kwargs)
reader = TestReader()
reader.feed(b"+ok\r\n")
self.assertEquals(b"ok", reader.gets())
def test_invalid_offset(self):
data = b"+ok\r\n"
self.assertRaises(ValueError, self.reader.feed, data, 6)
def test_invalid_length(self):
data = b"+ok\r\n"
self.assertRaises(ValueError, self.reader.feed, data, 0, 6)
def test_ok_offset(self):
data = b"blah+ok\r\n"
self.reader.feed(data, 4)
self.assertEquals(b"ok", self.reply())
def test_ok_length(self):
data = b"blah+ok\r\n"
self.reader.feed(data, 4, len(data)-4)
self.assertEquals(b"ok", self.reply())
def test_feed_bytearray(self):
if sys.hexversion >= 0x02060000:
self.reader.feed(bytearray(b"+ok\r\n"))
self.assertEquals(b"ok", self.reply())
def test_maxbuf(self):
defaultmaxbuf = self.reader.getmaxbuf()
self.reader.setmaxbuf(0)
self.assertEquals(0, self.reader.getmaxbuf())
self.reader.setmaxbuf(10000)
self.assertEquals(10000, self.reader.getmaxbuf())
self.reader.setmaxbuf(None)
self.assertEquals(defaultmaxbuf, self.reader.getmaxbuf())
self.assertRaises(ValueError, self.reader.setmaxbuf, -4)
|