""" Smoke tests for the torrent-tracker DHT ctypes bindings. Run with: python tests/test_tracker_ffi_dht.py """ from __future__ import annotations import ctypes as C import os import sys ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, os.path.join(ROOT, "harness")) from tracker_ffi import ( # noqa: E402 DHTClient, DHTMessage, DHT_MSG_QUERY, DHT_MSG_RESPONSE, DHT_QUERY_GET_PEERS, TRACKER_ADDR_IPV4, TRACKER_ADDR_IPV6, TRACKER_OK, TrackerPeer, ) def _parse(client: DHTClient, raw: bytes) -> DHTMessage: msg = DHTMessage() raw_buf = C.create_string_buffer(raw, len(raw)) rc = client.lib.dht_parse_message(raw_buf, len(raw), C.byref(msg)) assert rc == TRACKER_OK return msg def test_get_peers_query_roundtrips_through_tracker_library(): client = DHTClient(bootstrap=()) client.node_id = b"abcdefghij0123456789" tx = b"aa" info_hash = bytes(range(20)) msg = _parse(client, client._get_peers_packet(info_hash, tx)) assert msg.type == DHT_MSG_QUERY assert msg.query == DHT_QUERY_GET_PEERS assert bytes(msg.transaction[:msg.transaction_len]) == tx assert bytes(msg.id) == client.node_id assert bytes(msg.info_hash) == info_hash assert msg.want_ipv4 == 1 assert msg.want_ipv6 == 1 def test_peers_response_parses_to_endpoint_tuples(): client = DHTClient(bootstrap=()) tx = b"bb" node_id = b"mnopqrstuvwxyz123456" token = b"tok" peers = (TrackerPeer * 2)() peers[0].family = TRACKER_ADDR_IPV4 for i, b in enumerate((8, 8, 8, 8)): peers[0].addr[i] = b peers[0].port = 51413 peers[1].family = TRACKER_ADDR_IPV6 peers[1].addr[15] = 2 peers[1].port = 51414 buf = C.create_string_buffer(1024) written = C.c_size_t() tx_buf = C.create_string_buffer(tx, len(tx)) id_buf = C.create_string_buffer(node_id, len(node_id)) token_buf = C.create_string_buffer(token, len(token)) rc = client.lib.dht_write_peers_response( tx_buf, len(tx), id_buf, token_buf, len(token), peers, 2, buf, C.sizeof(buf), C.byref(written)) assert rc == TRACKER_OK msg = _parse(client, buf.raw[:written.value]) assert msg.type == DHT_MSG_RESPONSE assert bytes(msg.transaction[:msg.transaction_len]) == tx assert bytes(msg.id) == node_id assert bytes(msg.token[:msg.token_len]) == token assert msg.peer_count == 2 assert client._peer_endpoint(msg.peers[0]) == ("8.8.8.8", 51413) assert client._peer_endpoint(msg.peers[1]) == ("::2", 51414) if __name__ == "__main__": test_get_peers_query_roundtrips_through_tracker_library() test_peers_response_parses_to_endpoint_tuples() print("tracker DHT ffi OK")