1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
import unittest
import dns.exception
import dns.flags
import dns.message
import dns.renderer
import dns.tsig
import dns.tsigkeyring
basic_answer = """flags QR
edns 0
payload 4096
;QUESTION
foo.example. IN A
;ANSWER
foo.example. 30 IN A 10.0.0.1
foo.example. 30 IN A 10.0.0.2
"""
class RendererTestCase(unittest.TestCase):
def test_basic(self):
r = dns.renderer.Renderer(flags=dns.flags.QR, max_size=512)
qname = dns.name.from_text("foo.example")
r.add_question(qname, dns.rdatatype.A)
rds = dns.rdataset.from_text("in", "a", 30, "10.0.0.1", "10.0.0.2")
r.add_rdataset(dns.renderer.ANSWER, qname, rds)
r.add_edns(0, 0, 4096)
r.write_header()
wire = r.get_wire()
message = dns.message.from_wire(wire)
expected = dns.message.from_text(basic_answer)
# Our rendered message purposely has a random query id so we
# exercise that code, so copy it into the expected message.
expected.id = message.id
self.assertEqual(message, expected)
def test_tsig(self):
r = dns.renderer.Renderer(flags=dns.flags.RD, max_size=512)
qname = dns.name.from_text("foo.example")
r.add_question(qname, dns.rdatatype.A)
keyring = dns.tsigkeyring.from_text({"key": "12345678"})
keyname = next(iter(keyring))
r.write_header()
r.add_tsig(
keyname, keyring[keyname], 300, r.id, 0, b"", b"", dns.tsig.HMAC_SHA256
)
wire = r.get_wire()
message = dns.message.from_wire(wire, keyring=keyring)
expected = dns.message.make_query(qname, dns.rdatatype.A)
expected.id = message.id
self.assertEqual(message, expected)
def test_multi_tsig(self):
qname = dns.name.from_text("foo.example")
keyring = dns.tsigkeyring.from_text({"key": "12345678"})
keyname = next(iter(keyring))
r = dns.renderer.Renderer(flags=dns.flags.RD, max_size=512)
r.add_question(qname, dns.rdatatype.A)
r.write_header()
ctx = r.add_multi_tsig(
None,
keyname,
keyring[keyname],
300,
r.id,
0,
b"",
b"",
dns.tsig.HMAC_SHA256,
)
wire = r.get_wire()
message = dns.message.from_wire(wire, keyring=keyring, multi=True)
expected = dns.message.make_query(qname, dns.rdatatype.A)
expected.id = message.id
self.assertEqual(message, expected)
r = dns.renderer.Renderer(flags=dns.flags.RD, max_size=512)
r.add_question(qname, dns.rdatatype.A)
r.write_header()
ctx = r.add_multi_tsig(
ctx, keyname, keyring[keyname], 300, r.id, 0, b"", b"", dns.tsig.HMAC_SHA256
)
wire = r.get_wire()
message = dns.message.from_wire(
wire, keyring=keyring, tsig_ctx=message.tsig_ctx, multi=True
)
expected = dns.message.make_query(qname, dns.rdatatype.A)
expected.id = message.id
self.assertEqual(message, expected)
def test_going_backwards_fails(self):
r = dns.renderer.Renderer(flags=dns.flags.QR, max_size=512)
qname = dns.name.from_text("foo.example")
r.add_question(qname, dns.rdatatype.A)
r.add_edns(0, 0, 4096)
rds = dns.rdataset.from_text("in", "a", 30, "10.0.0.1", "10.0.0.2")
def bad():
r.add_rdataset(dns.renderer.ANSWER, qname, rds)
self.assertRaises(dns.exception.FormError, bad)
def test_reservation(self):
r = dns.renderer.Renderer(flags=dns.flags.QR, max_size=512)
r.reserve(100)
assert r.max_size == 412
r.release_reserved()
assert r.max_size == 512
with self.assertRaises(ValueError):
r.reserve(-1)
with self.assertRaises(ValueError):
r.reserve(513)
|