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
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)
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