# -*- coding: utf-8 # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license import unittest import dns.name import dns.rdata import dns.rdataclass import dns.rdataset import dns.rdatatype class RdatasetTestCase(unittest.TestCase): def testCodec2003(self): r1 = dns.rdataset.from_text_list("in", "ns", 30, ["Königsgäßchen"]) r2 = dns.rdataset.from_text_list("in", "ns", 30, ["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.rdataset.from_text_list( "in", "ns", 30, ["Königsgäßchen"], idna_codec=dns.name.IDNA_2008 ) r2 = dns.rdataset.from_text_list( "in", "ns", 30, ["xn--knigsgchen-b4a3dun"], idna_codec=dns.name.IDNA_2008 ) self.assertEqual(r1, r2) def testCopy(self): r1 = dns.rdataset.from_text_list("in", "a", 30, ["10.0.0.1", "10.0.0.2"]) r2 = r1.copy() self.assertFalse(r1 is r2) self.assertTrue(r1 == r2) def testAddIncompatible(self): rds = dns.rdataset.Rdataset(dns.rdataclass.IN, dns.rdatatype.A) rd1 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.A, "10.0.0.1") rd2 = dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.AAAA, "::1") rds.add(rd1, 30) self.assertRaises(dns.rdataset.IncompatibleTypes, lambda: rds.add(rd2, 30)) def testDifferingCovers(self): rds = dns.rdataset.Rdataset( dns.rdataclass.IN, dns.rdatatype.RRSIG, dns.rdatatype.A ) rd1 = dns.rdata.from_text( dns.rdataclass.IN, dns.rdatatype.RRSIG, "A 1 3 3600 20200101000000 20030101000000 2143 foo Ym9ndXM=", ) rd2 = dns.rdata.from_text( dns.rdataclass.IN, dns.rdatatype.RRSIG, "AAAA 1 3 3600 20200101000000 20030101000000 2143 foo Ym9ndXM=", ) rds.add(rd1, 30) self.assertRaises(dns.rdataset.DifferingCovers, lambda: rds.add(rd2, 30)) def testUnionUpdate(self): rds1 = dns.rdataset.from_text("in", "a", 300, "10.0.0.1") rds2 = dns.rdataset.from_text("in", "a", 30, "10.0.0.2") rdse = dns.rdataset.from_text("in", "a", 30, "10.0.0.1", "10.0.0.2") rds1.union_update(rds2) self.assertEqual(rds1, rdse) def testIntersectionUpdate(self): rds1 = dns.rdataset.from_text("in", "a", 300, "10.0.0.1", "10.0.0.2") rds2 = dns.rdataset.from_text("in", "a", 30, "10.0.0.2") rdse = dns.rdataset.from_text("in", "a", 30, "10.0.0.2") rds1.intersection_update(rds2) self.assertEqual(rds1, rdse) def testNoEqualToOther(self): rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.1") self.assertFalse(rds == 123) def testEmptyRdataList(self): self.assertRaises(ValueError, lambda: dns.rdataset.from_rdata_list(300, [])) def testToTextNoName(self): rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.1") text = rds.to_text() self.assertEqual(text, "300 IN A 10.0.0.1") def testToTextOverrideClass(self): rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.1") text = rds.to_text(override_rdclass=dns.rdataclass.NONE) self.assertEqual(text, "300 NONE A 10.0.0.1") def testRepr(self): rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.1") self.assertEqual(repr(rds), "]>") def testTruncatedRepr(self): rds = dns.rdataset.from_text("in", "txt", 300, "a" * 200) # * 99 not * 100 below as the " counts as one of the 100 chars self.assertEqual(repr(rds), ']>") def testStr(self): rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.1") self.assertEqual(str(rds), "300 IN A 10.0.0.1") def testMultilineToText(self): rds = dns.rdataset.from_text("in", "a", 300, "10.0.0.1", "10.0.0.2") self.assertEqual(rds.to_text(), "300 IN A 10.0.0.1\n300 IN A 10.0.0.2") def testCoveredRepr(self): rds = dns.rdataset.from_text( "in", "rrsig", 300, "NSEC 1 3 3600 " + "20190101000000 20030101000000 " + "2143 foo Ym9ndXM=", ) # Using startswith as I don't care about the repr of the rdata, # just the covers self.assertTrue(repr(rds).startswith("