Exemplo n.º 1
0
    def test_find_node_request_datagram(self):
        self.assertRaises(ValueError, RequestDatagram.make_find_node, b'1' * 49, b'2' * 48, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_find_node, b'1' * 48, b'2' * 49, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_find_node, b'1' * 48, b'2' * 48, b'1' * 21)
        self.assertEqual(20, len(RequestDatagram.make_find_node(b'1' * 48, b'2' * 48).rpc_id))

        serialized = RequestDatagram.make_find_node(b'1' * 48, b'2' * 48, b'1' * 20).bencode()
        decoded = decode_datagram(serialized)
        self.assertEqual(decoded.packet_type, REQUEST_TYPE)
        self.assertEqual(decoded.rpc_id, b'1' * 20)
        self.assertEqual(decoded.node_id, b'1' * 48)
        self.assertEqual(decoded.method, b'findNode')
        self.assertListEqual(decoded.args, [b'2' * 48, {b'protocolVersion': 1}])
Exemplo n.º 2
0
 async def find_node(
         self, key: bytes) -> typing.List[typing.Tuple[bytes, str, int]]:
     """
     :return: [(node_id, address, udp_port), ...]
     """
     if len(key) != constants.hash_bits // 8:
         raise ValueError(f"invalid length of find node key: {len(key)}")
     response = await self.protocol.send_request(
         self.peer,
         RequestDatagram.make_find_node(self.protocol.node_id, key))
     return [(node_id, address.decode(), udp_port)
             for node_id, address, udp_port in response.response]