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. #'''