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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
import pytest
import dns.rrset
from dns.zonefile import read_rrsets
expected_mx_1= dns.rrset.from_text('name.', 300, 'in', 'mx', '10 a.', '20 b.')
expected_mx_2 = dns.rrset.from_text('name.', 10, 'in', 'mx', '10 a.', '20 b.')
expected_mx_3 = dns.rrset.from_text('foo.', 10, 'in', 'mx', '10 a.')
expected_mx_4 = dns.rrset.from_text('bar.', 10, 'in', 'mx', '20 b.')
expected_mx_5 = dns.rrset.from_text('foo.example.', 10, 'in', 'mx',
'10 a.example.')
expected_mx_6 = dns.rrset.from_text('bar.example.', 10, 'in', 'mx', '20 b.')
expected_mx_7 = dns.rrset.from_text('foo', 10, 'in', 'mx', '10 a')
expected_mx_8 = dns.rrset.from_text('bar', 10, 'in', 'mx', '20 b.')
expected_ns_1 = dns.rrset.from_text('name.', 300, 'in', 'ns', 'hi.')
expected_ns_2 = dns.rrset.from_text('name.', 300, 'ch', 'ns', 'hi.')
def equal_rrsets(a, b):
# return True iff. a and b have the same rrsets regardless of order
if len(a) != len(b):
return False
for rrset in a:
if not rrset in b:
return False
return True
def test_name_ttl_rdclass_forced():
input=''';
mx 10 a
mx 20 b.
ns hi'''
rrsets = read_rrsets(input, name='name', ttl=300)
assert equal_rrsets(rrsets, [expected_mx_1, expected_ns_1])
assert rrsets[0].ttl == 300
assert rrsets[1].ttl == 300
def test_name_ttl_rdclass_forced_rdata_split():
input=''';
mx 10 a
ns hi
mx 20 b.'''
rrsets = read_rrsets(input, name='name', ttl=300)
assert equal_rrsets(rrsets, [expected_mx_1, expected_ns_1])
def test_name_ttl_rdclass_rdtype_forced():
input=''';
10 a
20 b.'''
rrsets = read_rrsets(input, name='name', ttl=300, rdtype='mx')
assert equal_rrsets(rrsets, [expected_mx_1])
def test_name_rdclass_forced():
input = '''30 mx 10 a
10 mx 20 b.
'''
rrsets = read_rrsets(input, name='name')
assert equal_rrsets(rrsets, [expected_mx_2])
assert rrsets[0].ttl == 10
def test_rdclass_forced():
input = ''';
foo 20 mx 10 a
bar 30 mx 20 b.
'''
rrsets = read_rrsets(input)
assert equal_rrsets(rrsets, [expected_mx_3, expected_mx_4])
def test_rdclass_forced_with_origin():
input = ''';
foo 20 mx 10 a
bar.example. 30 mx 20 b.
'''
rrsets = read_rrsets(input, origin='example')
assert equal_rrsets(rrsets, [expected_mx_5, expected_mx_6])
def test_rdclass_forced_with_origin_relativized():
input = ''';
foo 20 mx 10 a.example.
bar.example. 30 mx 20 b.
'''
rrsets = read_rrsets(input, origin='example', relativize=True)
assert equal_rrsets(rrsets, [expected_mx_7, expected_mx_8])
def test_rdclass_matching_default_tolerated():
input = ''';
foo 20 mx 10 a.example.
bar.example. 30 in mx 20 b.
'''
rrsets = read_rrsets(input, origin='example', relativize=True,
rdclass=None)
assert equal_rrsets(rrsets, [expected_mx_7, expected_mx_8])
def test_rdclass_not_matching_default_rejected():
input = ''';
foo 20 mx 10 a.example.
bar.example. 30 ch mx 20 b.
'''
with pytest.raises(dns.exception.SyntaxError):
rrsets = read_rrsets(input, origin='example', relativize=True,
rdclass=None)
def test_default_rdclass_is_none():
input = ''
with pytest.raises(TypeError):
rrsets = read_rrsets(input, default_rdclass=None, origin='example',
relativize=True)
def test_name_rdclass_rdtype_force():
# No real-world usage should do this, but it can be specified so we test it.
input = ''';
30 10 a
10 20 b.
'''
rrsets = read_rrsets(input, name='name', rdtype='mx')
assert equal_rrsets(rrsets, [expected_mx_1])
assert rrsets[0].ttl == 10
def test_rdclass_rdtype_force():
# No real-world usage should do this, but it can be specified so we test it.
input = ''';
foo 30 10 a
bar 30 20 b.
'''
rrsets = read_rrsets(input, rdtype='mx')
assert equal_rrsets(rrsets, [expected_mx_3, expected_mx_4])
# also weird but legal
#input5 = '''foo 30 10 a
#bar 10 20 foo.
#'''
|