# -*- coding: utf-8 # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license # Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose with or without fee is hereby granted, # provided that the above copyright notice and this permission notice # appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. import unittest import dns.name import dns.rrset class RRsetTestCase(unittest.TestCase): def testEqual1(self): r1 = dns.rrset.from_text("foo", 300, "in", "a", "10.0.0.1", "10.0.0.2") r2 = dns.rrset.from_text("FOO", 300, "in", "a", "10.0.0.2", "10.0.0.1") self.assertEqual(r1, r2) def testEqual2(self): r1 = dns.rrset.from_text("foo", 300, "in", "a", "10.0.0.1", "10.0.0.2") r2 = dns.rrset.from_text("FOO", 600, "in", "a", "10.0.0.2", "10.0.0.1") self.assertEqual(r1, r2) def testNotEqual1(self): r1 = dns.rrset.from_text("fooa", 30, "in", "a", "10.0.0.1", "10.0.0.2") r2 = dns.rrset.from_text("FOO", 30, "in", "a", "10.0.0.2", "10.0.0.1") self.assertNotEqual(r1, r2) def testNotEqual2(self): r1 = dns.rrset.from_text("foo", 30, "in", "a", "10.0.0.1", "10.0.0.3") r2 = dns.rrset.from_text("FOO", 30, "in", "a", "10.0.0.2", "10.0.0.1") self.assertNotEqual(r1, r2) def testNotEqual3(self): r1 = dns.rrset.from_text( "foo", 30, "in", "a", "10.0.0.1", "10.0.0.2", "10.0.0.3" ) r2 = dns.rrset.from_text("FOO", 30, "in", "a", "10.0.0.2", "10.0.0.1") self.assertNotEqual(r1, r2) def testNotEqual4(self): r1 = dns.rrset.from_text("foo", 30, "in", "a", "10.0.0.1") r2 = dns.rrset.from_text("FOO", 30, "in", "a", "10.0.0.2", "10.0.0.1") self.assertNotEqual(r1, r2) def testCodec2003(self): r1 = dns.rrset.from_text_list( "Königsgäßchen", 30, "in", "ns", ["Königsgäßchen"] ) r2 = dns.rrset.from_text_list( "xn--knigsgsschen-lcb0w", 30, "in", "ns", ["xn--knigsgsschen-lcb0w"] ) self.assertEqual(r1, r2) @unittest.skipUnless( dns.name.have_idna_2008, "Python idna cannot be imported; no IDNA2008" ) def testCodec2008(self): r1 = dns.rrset.from_text_list( "Königsgäßchen", 30, "in", "ns", ["Königsgäßchen"], idna_codec=dns.name.IDNA_2008, ) r2 = dns.rrset.from_text_list( "xn--knigsgchen-b4a3dun", 30, "in", "ns", ["xn--knigsgchen-b4a3dun"], idna_codec=dns.name.IDNA_2008, ) self.assertEqual(r1, r2) def testCopy(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) r2 = r1.copy() self.assertFalse(r1 is r2) self.assertTrue(r1 == r2) def testFullMatch1(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) self.assertTrue( r1.full_match( r1.name, dns.rdataclass.IN, dns.rdatatype.A, dns.rdatatype.NONE ) ) def testFullMatch2(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) r1.deleting = dns.rdataclass.NONE self.assertTrue( r1.full_match( r1.name, dns.rdataclass.IN, dns.rdatatype.A, dns.rdatatype.NONE, dns.rdataclass.NONE, ) ) def testNoFullMatch1(self): n = dns.name.from_text("bar", None) r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) self.assertFalse( r1.full_match( n, dns.rdataclass.IN, dns.rdatatype.A, dns.rdatatype.NONE, dns.rdataclass.ANY, ) ) def testNoFullMatch2(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) r1.deleting = dns.rdataclass.NONE self.assertFalse( r1.full_match( r1.name, dns.rdataclass.IN, dns.rdatatype.A, dns.rdatatype.NONE, dns.rdataclass.ANY, ) ) def testNoFullMatch3(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) self.assertFalse( r1.full_match( r1.name, dns.rdataclass.IN, dns.rdatatype.MX, dns.rdatatype.NONE, dns.rdataclass.ANY, ) ) def testMatchCompatibilityWithFullMatch(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) self.assertTrue( r1.match(r1.name, dns.rdataclass.IN, dns.rdatatype.A, dns.rdatatype.NONE) ) def testMatchCompatibilityWithRdatasetMatch(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) self.assertTrue( r1.match(dns.rdataclass.IN, dns.rdatatype.A, dns.rdatatype.NONE) ) def testToRdataset(self): r1 = dns.rrset.from_text_list("foo", 30, "in", "a", ["10.0.0.1", "10.0.0.2"]) r2 = dns.rdataset.from_text_list("in", "a", 30, ["10.0.0.1", "10.0.0.2"]) self.assertEqual(r1.to_rdataset(), r2) def testFromRdata(self): rdata1 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, "10.0.0.1") rdata2 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, "10.0.0.2") expected_rrs = dns.rrset.from_text( "foo", 300, "in", "a", "10.0.0.1", "10.0.0.2" ) rrs = dns.rrset.from_rdata("foo", 300, rdata1, rdata2) self.assertEqual(rrs, expected_rrs) def testEmptyList(self): def bad(): rrs = dns.rrset.from_rdata_list("foo", 300, []) self.assertRaises(ValueError, bad) def testTTLMinimization(self): rrs = dns.rrset.RRset( dns.name.from_text("foo"), dns.rdataclass.IN, dns.rdatatype.A ) rdata1 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, "10.0.0.1") rdata2 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, "10.0.0.2") rrs.add(rdata1, 300) self.assertEqual(rrs.ttl, 300) rrs.add(rdata2, 30) self.assertEqual(rrs.ttl, 30) # adding the same thing with a smaller TTL also minimizes rrs.add(rdata2, 3) self.assertEqual(rrs.ttl, 3) def testNotEqualOtherType(self): rrs = dns.rrset.RRset( dns.name.from_text("foo"), dns.rdataclass.IN, dns.rdatatype.A ) self.assertFalse(rrs == 123) def testRepr(self): rrset = dns.rrset.from_text("foo", 30, "in", "a", "10.0.0.1", "10.0.0.2") self.assertEqual(repr(rrset), ", <10.0.0.2>]>") rrset.deleting = dns.rdataclass.NONE self.assertEqual( repr(rrset), ", <10.0.0.2>]>", ) rrset = dns.rrset.from_text( "foo", 30, "in", "rrsig", "A 1 3 3600 20200701000000 20200601000000 1 NAME Ym9ndXM=", ) self.assertEqual( repr(rrset), "]>", ) if __name__ == "__main__": unittest.main()