pydoh/tests/test_wire.py

49 lines
1.5 KiB
Python
Raw Normal View History

2026-07-19 20:36:56 +05:00
import struct
2026-07-19 20:51:04 +05:00
from pydoh.wire import build_query, parse_response
2026-07-19 20:36:56 +05:00
def test_build_query_shape():
query, query_id = build_query("example.com")
assert isinstance(query, bytes)
assert 0 <= query_id <= 0xFFFF
assert query[12:20] == b"\x07example"
def test_parse_response_a_record():
query, query_id = build_query("example.com")
question = query[12:]
header = struct.pack(">HHHHHH", query_id, 0x8180, 1, 1, 0, 0)
answer = b"\xc0\x0c" + struct.pack(">HHIH", 1, 1, 300, 4) + bytes([93, 184, 216, 34])
response = header + question + answer
resp_id, answers = parse_response(response)
assert resp_id == query_id
assert answers == [("93.184.216.34", 300)]
def test_parse_response_aaaa_record():
query, query_id = build_query("example.com", record_type=28)
question = query[12:]
rdata = bytes.fromhex("20010db8000000000000000000000001")
header = struct.pack(">HHHHHH", query_id, 0x8180, 1, 1, 0, 0)
answer = b"\xc0\x0c" + struct.pack(">HHIH", 28, 1, 60, 16) + rdata
response = header + question + answer
resp_id, answers = parse_response(response)
assert resp_id == query_id
assert answers == [("2001:0db8:0000:0000:0000:0000:0000:0001", 60)]
def test_parse_response_no_answers():
query, query_id = build_query("nx.example.com")
question = query[12:]
header = struct.pack(">HHHHHH", query_id, 0x8183, 1, 0, 0, 0)
response = header + question
resp_id, answers = parse_response(response)
assert resp_id == query_id
assert answers == []