From: Anthony B. <ant...@us...> - 2002-03-19 10:30:37
|
Update of /cvsroot/pydns/pydns/tests In directory usw-pr-cvs1:/tmp/cvs-serv29678/tests Modified Files: testPackers.py Log Message: first round of major bits and pieces. The major stuff here (summarised from my local, off-net CVS server :/ this will cause some oddities with the tests/testPackers.py: a large slab of unit tests for the packer and unpacker code in DNS.Lib DNS/Lib.py: placeholder for addSRV. added 'klass' to addA, make it the same as the other A* records. made addTXT check for being passed a string, turn it into a length 1 list. explicitly check for adding a string of length > 255 (prohibited). a bunch of cleanups from a first pass with pychecker new code for pack/unpack. the bitwise stuff uses struct, for a smallish (disappointly small, actually) improvement, while addr2bin is much much faster now. DNS/Base.py: added DiscoverNameServers. This automatically does the right thing on unix/ win32. No idea how MacOS handles this. *sigh* Incompatible change: Don't use ParseResolvConf on non-unix, use this function, instead! a bunch of cleanups from a first pass with pychecker Index: testPackers.py =================================================================== RCS file: /cvsroot/pydns/pydns/tests/testPackers.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** testPackers.py 10 Aug 2001 00:13:35 -0000 1.2 --- testPackers.py 19 Mar 2002 10:30:33 -0000 1.3 *************** *** 5,15 **** # # only tests the simple packers for now. next is to test the ! # classes: Packer/Unpacker, RRpacker/RRunpacker, Hpacker/Hunpacker, # Qpacker/Unpacker, then Mpacker/Munpacker # import DNS import unittest class Int16Packing(unittest.TestCase): knownValues = ( ( 10, '\x00\n'), --- 5,19 ---- # # only tests the simple packers for now. next is to test the ! # classes: Hpacker/Hunpacker, # Qpacker/Unpacker, then Mpacker/Munpacker # + # Start doing unpleasant tests with broken data, truncations, that + # sort of thing. import DNS import unittest + TestCompleted = "TestCompleted" # exc. + class Int16Packing(unittest.TestCase): knownValues = ( ( 10, '\x00\n'), *************** *** 75,81 **** self.assertEqual(i,result) ! # more to come... --- 79,368 ---- self.assertEqual(i,result) + class PackerClassPacking(unittest.TestCase): + knownPackValues = [ + ( ['www.ekit.com'], '\x03www\x04ekit\x03com\x00' ), + ( ['ns1.ekorp.com', 'ns2.ekorp.com', 'ns3.ekorp.com'], + '\x03ns1\x05ekorp\x03com\x00\x03ns2\xc0\x04\x03ns3\xc0\x04'), + ( ['a.root-servers.net.', 'b.root-servers.net.', + 'c.root-servers.net.', 'd.root-servers.net.', + 'e.root-servers.net.', 'f.root-servers.net.'], + '\x01a\x0croot-servers\x03net\x00\x01b\xc0\x02\x01c\xc0'+ + '\x02\x01d\xc0\x02\x01e\xc0\x02\x01f\xc0\x02' ), + ] + knownUnpackValues = [ + ( ['www.ekit.com'], '\x03www\x04ekit\x03com\x00' ), + ( ['ns1.ekorp.com', 'ns2.ekorp.com', 'ns3.ekorp.com'], + '\x03ns1\x05ekorp\x03com\x00\x03ns2\xc0\x04\x03ns3\xc0\x04'), + ( ['a.root-servers.net', 'b.root-servers.net', + 'c.root-servers.net', 'd.root-servers.net', + 'e.root-servers.net', 'f.root-servers.net'], + '\x01a\x0croot-servers\x03net\x00\x01b\xc0\x02\x01c\xc0'+ + '\x02\x01d\xc0\x02\x01e\xc0\x02\x01f\xc0\x02' ), + ] ! def testPackNames(self): ! from DNS.Lib import Packer ! for namelist,result in self.knownPackValues: ! p = Packer() ! for n in namelist: ! p.addname(n) ! self.assertEqual(p.getbuf(),result) ! ! def testUnpackNames(self): ! from DNS.Lib import Unpacker ! for namelist,result in self.knownUnpackValues: ! u = Unpacker(result) ! names = [] ! for i in range(len(namelist)): ! n = u.getname() ! names.append(n) ! self.assertEqual(names, namelist) ! ! def testUnpackerLimitCheck(self): ! from DNS.Lib import Unpacker ! u=Unpacker('\x03ns1\x05ekorp\x03com\x00\x03ns2\xc0\x04\x03ns3\xc0\x04') ! u.getname() ; u.getname() ; u.getname() ! # 4th call should fail ! self.assertRaises(IndexError, u.getname) ! ! class testUnpackingMangled(unittest.TestCase): ! "addA(self, name, klass, ttl, address)" ! packerCorrect = '\x05www02\x04ekit\x03com\x00\x00\x01\x00\x01\x00\x01Q\x80\x00\x04\xc0\xa8\n\x02' ! def testWithoutRR(self): ! u = DNS.Lib.RRunpacker(self.packerCorrect) ! u.getAdata() ! def testWithTwoRRs(self): ! u = DNS.Lib.RRunpacker(self.packerCorrect) ! u.getRRheader() ! self.assertRaises(DNS.Lib.UnpackError, u.getRRheader) ! def testWithNoGetData(self): ! u = DNS.Lib.RRunpacker(self.packerCorrect) ! u.getRRheader() ! self.assertRaises(DNS.Lib.UnpackError, u.endRR) ! ! class PackerTestCase(unittest.TestCase): ! " base class for tests of Packing code. Laziness on my part, I know. " ! def testPacker(self): ! from DNS.Lib import RRpacker ! p = RRpacker() ! check = self.doPack(p) ! if (p is not None) and (check is not TestCompleted): ! return self.checkPackResult(p) ! ! def checkPackResult(self, buf): ! if not hasattr(self, 'packerExpectedResult'): ! if self.__class__.__name__ != 'PackerTestCase': ! print "P***", self, repr(buf.getbuf()) #cheat testcase ! else: ! return self.assertEqual(buf.getbuf(), ! self.packerExpectedResult) ! ! def checkUnpackResult(self, rrbits, specbits): ! if not hasattr(self, 'unpackerExpectedResult'): ! if self.__class__.__name__ != 'PackerTestCase': ! print "U***", self, repr((rrbits,specbits)) #cheat testcase ! else: ! return self.assertEqual((rrbits, specbits), ! self.unpackerExpectedResult) + def testUnpacker(self): + from DNS.Lib import RRunpacker + if self.doUnpack is not None: + if hasattr(self.__class__, 'doUnpack') \ + and hasattr(self, 'packerExpectedResult'): + u = RRunpacker(self.packerExpectedResult) + rrbits = u.getRRheader()[:4] + specbits = self.doUnpack(u) + try: + u.endRR() + except DNS.Lib.UnpackError: + self.assertEqual(0, 'Not at end of RR!') + return self.checkUnpackResult(rrbits, specbits) + else: + me = self.__class__.__name__ + if me != 'PackerTestCase': + self.assertEquals(self.__class__.__name__, + 'Unpack NotImplemented') + + def doPack(self, p): + " stub. don't test the base class " + return None + + def doUnpack(self, p): + " stub. don't test the base class " + return None + + + + class testPackingOfCNAME(PackerTestCase): + "addCNAME(self, name, klass, ttl, cname)" + def doPack(self,p): + p.addCNAME('www.sub.domain', DNS.Class.IN, 3600, 'realhost.sub.domain') + def doUnpack(self, u): + return u.getCNAMEdata() + + unpackerExpectedResult = (('www.sub.domain', DNS.Type.CNAME, DNS.Class.IN, 3600), 'realhost.sub.domain') + packerExpectedResult = \ + '\x03www\x03sub\x06domain\x00\x00\x05\x00\x01\x00'+ \ + '\x00\x0e\x10\x00\x0b\x08realhost\xc0\x04' + + class testPackingOfCNAME2(PackerTestCase): + "addCNAME(self, name, klass, ttl, cname)" + def doPack(self,p): + p.addCNAME('www.cust.com', DNS.Class.IN, 200, 'www023.big.isp.com') + def doUnpack(self, u): + return u.getCNAMEdata() + unpackerExpectedResult = (('www.cust.com', DNS.Type.CNAME, DNS.Class.IN, 200), 'www023.big.isp.com') + packerExpectedResult = \ + '\x03www\x04cust\x03com\x00\x00\x05\x00\x01\x00'+ \ + '\x00\x00\xc8\x00\x11\x06www023\x03big\x03isp\xc0\t' + + class testPackingOfCNAME3(PackerTestCase): + "addCNAME(self, name, klass, ttl, cname)" + def doPack(self,p): + p.addCNAME('www.fred.com', DNS.Class.IN, 86400, 'webhost.loa.com') + def doUnpack(self, u): + return u.getCNAMEdata() + unpackerExpectedResult = (('www.fred.com', DNS.Type.CNAME, DNS.Class.IN, 86400), 'webhost.loa.com') + packerExpectedResult = \ + '\x03www\x04fred\x03com\x00\x00\x05\x00\x01\x00\x01Q'+ \ + '\x80\x00\x0e\x07webhost\x03loa\xc0\t' + + class testPackingOfHINFO(PackerTestCase): + "addHINFO(self, name, klass, ttl, cpu, os)" + def doPack(self,p): + p.addHINFO('www.sub.domain.com', DNS.Class.IN, 3600, 'i686', 'linux') + def doUnpack(self, u): + return u.getHINFOdata() + unpackerExpectedResult = (('www.sub.domain.com', 13, 1, 3600), ('i686', 'linux')) + packerExpectedResult = \ + '\x03www\x03sub\x06domain\x03com\x00\x00\r\x00\x01'+ \ + '\x00\x00\x0e\x10\x00\x0b\x04i686\x05linux' + + class testPackingOfHINFO2(PackerTestCase): + "addHINFO(self, name, klass, ttl, cpu, os)" + def doPack(self,p): + p.addHINFO('core1.lax.foo.com', DNS.Class.IN, 3600, 'cisco', 'ios') + def doUnpack(self, u): + return u.getHINFOdata() + unpackerExpectedResult = (('core1.lax.foo.com', 13, 1, 3600), ('cisco', 'ios')) + packerExpectedResult = \ + '\x05core1\x03lax\x03foo\x03com\x00\x00\r\x00\x01'+ \ + '\x00\x00\x0e\x10\x00\n\x05cisco\x03ios' + + class testPackingOfMX(PackerTestCase): + "addMX(self, name, klass, ttl, preference, exchange)" + def doPack(self, p): + p.addMX('sub.domain.com', DNS.Class.IN, 86400, 10, 'mailhost1.isp.com') + def doUnpack(self, u): + return u.getMXdata() + packerExpectedResult = \ + '\x03sub\x06domain\x03com\x00\x00\x0f\x00\x01'+ \ + '\x00\x01Q\x80\x00\x12\x00\n\tmailhost1\x03isp\xc0\x0b' + unpackerExpectedResult = (('sub.domain.com', 15, 1, 86400), (10, 'mailhost1.isp.com')) + + class testPackingOfMX2(PackerTestCase): + "addMX(self, name, klass, ttl, preference, exchange)" + def doPack(self, p): + p.addMX('ekit-inc.com.', DNS.Class.IN, 86400, 10, 'mx1.ekorp.com') + p.addMX('ekit-inc.com.', DNS.Class.IN, 86400, 20, 'mx2.ekorp.com') + p.addMX('ekit-inc.com.', DNS.Class.IN, 86400, 30, 'mx3.ekorp.com') + def doUnpack(self, u): + res = [u.getMXdata(),] + dummy = u.getRRheader()[:4] + res += u.getMXdata() + dummy = u.getRRheader()[:4] + res += u.getMXdata() + return res + unpackerExpectedResult = (('ekit-inc.com', 15, 1, 86400), [(10, 'mx1.ekorp.com'), 20, 'mx2.ekorp.com', 30, 'mx3.ekorp.com']) + packerExpectedResult = \ + '\x08ekit-inc\x03com\x00\x00\x0f\x00\x01\x00\x01Q\x80\x00'+\ + '\x0e\x00\n\x03mx1\x05ekorp\xc0\t\x00\x00\x0f\x00\x01\x00'+\ + '\x01Q\x80\x00\x08\x00\x14\x03mx2\xc0\x1e\x00\x00\x0f\x00'+\ + '\x01\x00\x01Q\x80\x00\x08\x00\x1e\x03mx3\xc0\x1e' + + class testPackingOfNS(PackerTestCase): + "addNS(self, name, klass, ttl, nsdname)" + def doPack(self, p): + p.addNS('ekit-inc.com', DNS.Class.IN, 86400, 'ns1.ekorp.com') + def doUnpack(self, u): + return u.getNSdata() + unpackerExpectedResult = (('ekit-inc.com', 2, 1, 86400), 'ns1.ekorp.com') + packerExpectedResult = '\x08ekit-inc\x03com\x00\x00\x02\x00\x01\x00\x01Q\x80\x00\x0c\x03ns1\x05ekorp\xc0\t' + + class testPackingOfPTR(PackerTestCase): + "addPTR(self, name, klass, ttl, ptrdname)" + def doPack(self, p): + p.addPTR('www.ekit-inc.com', DNS.Class.IN, 3600, 'www-real01.ekorp.com') + def doUnpack(self, u): + return u.getPTRdata() + unpackerExpectedResult = (('www.ekit-inc.com', 12, 1, 3600), 'www-real01.ekorp.com') + packerExpectedResult = '\x03www\x08ekit-inc\x03com\x00\x00\x0c\x00\x01\x00\x00\x0e\x10\x00\x13\nwww-real01\x05ekorp\xc0\r' + + class testPackingOfSOA(PackerTestCase): + """addSOA(self, name, klass, ttl, mname, + rname, serial, refresh, retry, expire, minimum)""" + def doPack(self, p): + p.addSOA('ekit-inc.com', DNS.Class.IN, 3600, 'ns1.ekorp.com', + 'hostmaster.ekit-inc.com', 2002020301, 100, 200, 300, 400) + def doUnpack(self, u): + return u.getSOAdata() + unpackerExpectedResult = (('ekit-inc.com', 6, 1, 3600), ('ns1.ekorp.com', 'hostmaster', ('serial', 2002020301), ('refresh ', 100, '1 minutes'), ('retry', 200, '3 minutes'), ('expire', 300, '5 minutes'), ('minimum', 400, '6 minutes'))) + packerExpectedResult = '\x08ekit-inc\x03com\x00\x00\x06\x00\x01\x00\x00\x0e\x10\x00,\x03ns1\x05ekorp\xc0\t\nhostmaster\x00wTg\xcd\x00\x00\x00d\x00\x00\x00\xc8\x00\x00\x01,\x00\x00\x01\x90' + + + class testPackingOfA(PackerTestCase): + "addA(self, name, klass, ttl, address)" + def doPack(self, p): + p.addA('www02.ekit.com', DNS.Class.IN, 86400, '192.168.10.2') + def doUnpack(self, u): + return u.getAdata() + unpackerExpectedResult = (('www02.ekit.com', 1, 1, 86400), '192.168.10.2') + packerExpectedResult = '\x05www02\x04ekit\x03com\x00\x00\x01\x00\x01\x00\x01Q\x80\x00\x04\xc0\xa8\n\x02' + + class testPackingOfA2(PackerTestCase): + "addA(self, name, ttl, address)" + def doPack(self, p): + p.addA('www.ekit.com', DNS.Class.IN, 86400, '10.98.1.0') + def doUnpack(self, u): + return u.getAdata() + unpackerExpectedResult = (('www.ekit.com', 1, 1, 86400), '10.98.1.0') + packerExpectedResult = '\x03www\x04ekit\x03com\x00\x00\x01\x00\x01\x00\x01Q\x80\x00\x04\nb\x01\x00' + + class testPackingOfA3(PackerTestCase): + "addA(self, name, ttl, address)" + def doPack(self, p): + p.addA('www.zol.com', DNS.Class.IN, 86400, '192.168.10.4') + p.addA('www.zol.com', DNS.Class.IN, 86400, '192.168.10.3') + p.addA('www.zol.com', DNS.Class.IN, 86400, '192.168.10.2') + p.addA('www.zol.com', DNS.Class.IN, 86400, '192.168.10.1') + def doUnpack(self, u): + u1,d1,u2,d2,u3,d3,u4=u.getAdata(),u.getRRheader(),u.getAdata(),u.getRRheader(),u.getAdata(),u.getRRheader(),u.getAdata() + return u1,u2,u3,u4 + unpackerExpectedResult = (('www.zol.com', 1, 1, 86400), ('192.168.10.4', '192.168.10.3', '192.168.10.2', '192.168.10.1')) + packerExpectedResult = '\x03www\x03zol\x03com\x00\x00\x01\x00\x01\x00\x01Q\x80\x00\x04\xc0\xa8\n\x04\x00\x00\x01\x00\x01\x00\x01Q\x80\x00\x04\xc0\xa8\n\x03\x00\x00\x01\x00\x01\x00\x01Q\x80\x00\x04\xc0\xa8\n\x02\x00\x00\x01\x00\x01\x00\x01Q\x80\x00\x04\xc0\xa8\n\x01' + + class testPackingOfTXT(PackerTestCase): + "addTXT(self, name, klass, ttl, list)" + def doPack(self, p): + p.addTXT('ekit-inc.com', DNS.Class.IN, 3600, 'this is a text record') + def doUnpack(self, u): + return u.getTXTdata() + packerExpectedResult = '\x08ekit-inc\x03com\x00\x00\x10\x00\x01\x00\x00\x0e\x10\x00\x16\x15this is a text record' + unpackerExpectedResult = (('ekit-inc.com', 16, 1, 3600), ['this is a text record']) + + # check what the maximum/minimum &c of TXT records are. + class testPackingOfTXT2(PackerTestCase): + "addTXT(self, name, klass, ttl, list)" + def doPack(self, p): + f = lambda p=p:p.addTXT('ekit-inc.com', DNS.Class.IN, 3600, 'the quick brown fox jumped over the lazy brown dog\n'*20) + self.assertRaises(ValueError, f) + return TestCompleted + doUnpack = None + + #class testPackingOfQuestion(PackerTestCase): + # "addQuestion(self, qname, qtype, qclass)" + # def doPack(self, p): + # self.assertEquals(0,"NotImplemented") |