Example #1
0
 def test_ping_request_datagram(self):
     self.assertRaises(ValueError, RequestDatagram.make_ping, b'1' * 48, b'1' * 21)
     self.assertRaises(ValueError, RequestDatagram.make_ping, b'1' * 47, b'1' * 20)
     self.assertEqual(20, len(RequestDatagram.make_ping(b'1' * 48).rpc_id))
     serialized = RequestDatagram.make_ping(b'1' * 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'ping')
     self.assertListEqual(decoded.args, [{b'protocolVersion': 1}])
Example #2
0
 async def ping(self) -> bytes:
     """
     :return: b'pong'
     """
     response = await self.protocol.send_request(
         self.peer, RequestDatagram.make_ping(self.protocol.node_id))
     return response.response
Example #3
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]
Example #4
0
    def test_find_value_request(self):
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 49, b'2' * 48, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 48, b'2' * 49, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 48, b'2' * 48, b'1' * 21)
        self.assertRaises(ValueError, RequestDatagram.make_find_value,
                          b'1' * 48, b'2' * 48, b'1' * 20, -1)
        self.assertEqual(
            20,
            len(RequestDatagram.make_find_value(b'1' * 48, b'2' * 48).rpc_id))

        # default page argument
        serialized = RequestDatagram.make_find_value(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'findValue')
        self.assertListEqual(decoded.args,
                             [b'2' * 48, {
                                 b'protocolVersion': 1,
                                 b'p': 0
                             }])

        # nondefault page argument
        serialized = RequestDatagram.make_find_value(b'1' * 48, b'2' * 48,
                                                     b'1' * 20, 1).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'findValue')
        self.assertListEqual(decoded.args,
                             [b'2' * 48, {
                                 b'protocolVersion': 1,
                                 b'p': 1
                             }])
Example #5
0
    def test_store_request(self):
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 47, b'2' * 48, b'3' * 48, 3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 49, b'3' * 48, 3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 48, b'3' * 47, 3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 48, b'3' * 48, -3333, b'1' * 20)
        self.assertRaises(ValueError, RequestDatagram.make_store, b'1' * 48, b'2' * 48, b'3' * 48, 3333, b'1' * 21)

        serialized = RequestDatagram.make_store(b'1' * 48, b'2' * 48, b'3' * 48, 3333, 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'store')
Example #6
0
 async def find_value(self, key: bytes, page: int = 0) -> typing.Union[typing.Dict]:
     """
     :return: {
         b'token': <token bytes>,
         b'contacts': [(node_id, address, udp_port), ...]
         <key bytes>: [<blob_peer_compact_address, ...]
     }
     """
     if len(key) != constants.hash_bits // 8:
         raise ValueError(f"invalid length of find value key: {len(key)}")
     response = await self.protocol.send_request(
         self.peer, RequestDatagram.make_find_value(self.protocol.node_id, key, page=page)
     )
     self.peer_tracker.update_token(self.peer.node_id, response.response[b'token'])
     return response.response
Example #7
0
 async def store(self, blob_hash: bytes) -> bytes:
     """
     :param blob_hash: blob hash as bytes
     :return: b'OK'
     """
     if len(blob_hash) != constants.hash_bits // 8:
         raise ValueError(f"invalid length of blob hash: {len(blob_hash)}")
     if not self.protocol.peer_port or not 0 < self.protocol.peer_port < 65535:
         raise ValueError(f"invalid tcp port: {self.protocol.peer_port}")
     token = self.peer_tracker.get_node_token(self.peer.node_id)
     if not token:
         find_value_resp = await self.find_value(blob_hash)
         token = find_value_resp[b'token']
     response = await self.protocol.send_request(
         self.peer, RequestDatagram.make_store(self.protocol.node_id, blob_hash, token, self.protocol.peer_port)
     )
     return response.response