Esempio n. 1
0
def padded_varint_serializations_test() -> None:
    for _ in range(500):
        num: int = randint(0, 2**16)

        var_int: bytes = to_var_int(num)
        length: int = len(var_int)

        rpc_var_int: bytes = to_rpc_var_int(num)
        rpc_length: int = len(rpc_var_int)

        before: int = randint(0, 32)
        for i in range(before):
            var_int = bytes([randint(0, 255)]) + var_int
            rpc_var_int = bytes([randint(0, 255)]) + rpc_var_int
        for i in range(randint(0, 32)):
            var_int += bytes([randint(0, 255)])
            rpc_var_int += bytes([randint(0, 255)])

        res: Tuple[int, int] = from_var_int(var_int, before)
        assert res[0] == num
        assert res[1] == before + length

        rpc_res: Tuple[int, int] = from_rpc_var_int(rpc_var_int, before)
        assert res[0] == num
        assert res[1] == before + length
Esempio n. 2
0
def rpc_binary_parse_internal(data: bytes,
                              cursor: int,
                              code: int = -1) -> Tuple[Any, int]:
    """Parse data according to epee for the binary RPC calls."""

    result: Any = None
    if code == -1:
        code = data[cursor]
        cursor += 1

    if code in binary_lookup:
        result = binary_lookup[code].unpack_from(data, cursor)[0]
        cursor += binary_lookup[code].size
    elif code == 10:
        length: int
        (length, cursor) = from_rpc_var_int(data, cursor)
        result = data[cursor:cursor + length]
        cursor += length
    elif code == 12:
        result = {}

        fields: int
        (fields, cursor) = from_rpc_var_int(data, cursor)

        for _ in range(fields):
            length: int = data[cursor]
            cursor += 1

            name: str = data[cursor:cursor + length].decode("utf-8")
            cursor += length

            (result[name], cursor) = rpc_binary_parse_internal(data, cursor)
    elif code & 0x80 == 0x80:
        result = []
        length: int
        (length, cursor) = from_rpc_var_int(data, cursor)
        for _ in range(length):
            elem: Any
            (elem, cursor) = rpc_binary_parse_internal(data, cursor,
                                                       code & 0b1111)
            result.append(elem)

    if result is None:
        raise Exception("Failed to parse a binary RPC response.")
    return (result, cursor)
Esempio n. 3
0
def varint_serializations_test() -> None:
    for _ in range(500):
        num: int = randint(0, 2**16)
        assert from_var_int(to_var_int(num), 0)[0] == num
        assert from_rpc_var_int(to_rpc_var_int(num), 0)[0] == num