| 
 # Copyright (C) 2010  Internet Systems Consortium.  
#  
# Permission to use, copy, modify, and distribute this software 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 INTERNET SYSTEMS CONSORTIUM  
# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL  
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL  
# INTERNET SYSTEMS CONSORTIUM 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.  
  
#  
# Tests for the messagerenderer part of the pydnspp module  
#  
  
import unittest  
import os  
from pydnspp import *  
  
class NameComparisonTest(unittest.TestCase):  
    def setUp(self):  
        self.name1 = Name("aaaa.example.com")  
        self.name2 = Name("bbbb.example.com")  
        self.name3 = Name("cccc.example.com")  
        self.name4 = Name("aaaa.example.com")  
        self.name5 = Name("something.completely.different")  
  
        self.ncr12 = self.name1.compare(self.name2)  
        self.ncr13 = self.name1.compare(self.name3)  
        self.ncr23 = self.name2.compare(self.name3)  
        self.ncr21 = self.name2.compare(self.name1)  
        self.ncr32 = self.name3.compare(self.name2)  
        self.ncr31 = self.name3.compare(self.name1)  
        self.ncr14 = self.name1.compare(self.name4)  
        self.ncr15 = self.name1.compare(self.name5)  
  
    def test_init(self):  
        self.assertRaises(NotImplementedError, NameComparisonResult)  
  
    def test_get_order(self):  
        self.assertEqual(-1, self.ncr12.get_order())  
        self.assertEqual(-2, self.ncr13.get_order())  
        self.assertEqual(-1, self.ncr23.get_order())  
        self.assertEqual(1, self.ncr21.get_order())  
        self.assertEqual(1, self.ncr32.get_order())  
        self.assertEqual(2, self.ncr31.get_order())  
        self.assertEqual(0, self.ncr14.get_order())  
  
    def test_get_common_labels(self):  
        self.assertEqual(3, self.ncr12.get_common_labels())  
        self.assertEqual(1, self.ncr15.get_common_labels())  
  
    def test_get_relation(self):  
        self.assertEqual("COMMONANCESTOR", NameComparisonResult.NameRelation[self.ncr12.get_relation()])  
        self.assertEqual("COMMONANCESTOR", NameComparisonResult.NameRelation[self.ncr15.get_relation()])  
  
        superdomain = Name("com")  
        relation = superdomain.compare(self.name1)  
        self.assertEqual("SUPERDOMAIN", NameComparisonResult.NameRelation[relation.get_relation()])  
  
        subdomain = Name("sub.aaaa.example.com")  
        relation = subdomain.compare(self.name1)  
        self.assertEqual("SUBDOMAIN", NameComparisonResult.NameRelation[relation.get_relation()])  
  
        same = Name("aaaa.example.com")  
        relation = same.compare(self.name1)  
        self.assertEqual("EQUAL", NameComparisonResult.NameRelation[relation.get_relation()])  
  
class NameTest(unittest.TestCase):  
    def setUp(self):  
        self.name1 = Name("example.com")  
        self.name2 = Name(".")  
        self.name3 = Name("something.completely.different")  
        self.name4 = Name("EXAMPLE.com")  
        self.name5 = Name("*.example.com")  
  
    def test_init(self):  
        self.assertRaises(EmptyLabel, Name, "example..com")  
        self.assertRaises(TooLongLabel, Name, "a"*64 + ".example.com")  
        self.assertRaises(BadLabelType, Name, "\[asdf.example.com")  
        self.assertRaises(BadEscape, Name, "\\999")  
        self.assertRaises(TooLongName, Name, "example."*32 + "com")  
        self.assertRaises(IncompleteName, Name, "\\")  
        self.assertRaises(TypeError, Name, 1)  
  
        b = bytearray()  
        self.name1.to_wire(b)  
        self.assertEqual(self.name1, Name(b))  
        self.assertEqual(self.name1, Name(b, 0))  
        self.assertRaises(InvalidBufferPosition, Name, b, 100)  
        b = bytearray()  
        b += b'\x07example'*32 + b'\x03com\x00'  
        self.assertRaises(DNSMessageFORMERR, Name, b, 0)  
        self.assertRaises(IndexError, Name, b, -1)  
  
    def test_at(self):  
        self.assertEqual(7, self.name1.at(0))  
        self.assertEqual(101, self.name1.at(1))  
        self.assertRaises(IndexError, self.name1.at, 100)  
        self.assertRaises(IndexError, self.name1.at, 0x10000)  
        self.assertRaises(IndexError, self.name1.at, -1)  
        self.assertRaises(TypeError, self.name1.at, "wrong")  
  
    def test_get_length(self):  
        self.assertEqual(13, self.name1.get_length())  
        self.assertEqual(1, self.name2.get_length())  
        self.assertEqual(32, self.name3.get_length())  
  
    def test_get_labelcount(self):  
        self.assertEqual(3, self.name1.get_labelcount())  
        self.assertEqual(1, self.name2.get_labelcount())  
        self.assertEqual(4, self.name3.get_labelcount())  
  
    def test_to_text(self):  
        self.assertEqual("example.com.", self.name1.to_text())  
        self.assertEqual(".", self.name2.to_text())  
        self.assertEqual(".", str(self.name2))  
        self.assertEqual("something.completely.different.", self.name3.to_text())  
  
        self.assertEqual("example.com.", self.name1.to_text(False))  
        self.assertEqual("example.com", self.name1.to_text(True))  
  
        # make sure it does not behave unexpectedly on wrong arguments  
        self.assertRaises(TypeError, self.name1.to_text, True, 1)  
        self.assertRaises(TypeError, self.name1.to_text, 1)  
        self.assertRaises(TypeError, self.name1.to_text, [])  
        self.assertRaises(TypeError, self.name1.to_text, "foo")  
  
    def test_to_wire(self):  
        b1 = bytearray()  
        self.name1.to_wire(b1)  
        self.assertEqual(bytearray(b'\x07example\x03com\x00'), b1)  
        b2 = bytearray()  
        self.name2.to_wire(b2)  
        self.assertEqual(bytearray(b'\x00'), b2)  
  
        mr = MessageRenderer()  
        self.name1.to_wire(mr)  
        self.assertEqual(b'\x07example\x03com\x00', mr.get_data())  
  
        self.assertRaises(TypeError, self.name1.to_wire, "wrong")  
        self.assertRaises(TypeError, self.name1.to_wire, 1)  
  
    def test_compare(self):  
        # tested in comparison class above  
        pass  
  
    def test_equals(self):  
        self.assertFalse(self.name1.equals(self.name2))  
        self.assertFalse(self.name1.equals(self.name3))  
        self.assertTrue(self.name1.equals(self.name4))  
  
    def test_split(self):  
        s = self.name1.split(1,1)  
        self.assertEqual("com.", s.to_text())  
        s = self.name1.split(0,1)  
        self.assertEqual("example.", s.to_text())  
        s = self.name3.split(1,2)  
        self.assertEqual("completely.different.", s.to_text())  
        self.assertRaises(TypeError, self.name1.split, "wrong", 1)  
        self.assertRaises(TypeError, self.name1.split, 1, "wrong")  
  
        s = self.name1.split(1)  
        self.assertEqual("com.", s.to_text())  
  
        # Range check.  We need to do this at the binding level, so we need  
        # explicit tests for it.  
        self.assertRaises(IndexError, self.name1.split, 123, 1)  
        self.assertRaises(IndexError, self.name1.split, 1, 123)  
        self.assertRaises(IndexError, self.name1.split, 0x10000, 5)  
        self.assertRaises(IndexError, self.name1.split, -1, -1)  
        self.assertRaises(IndexError, self.name1.split, 0, -1)  
        self.assertRaises(IndexError, self.name1.split, -1, 0x10000)  
  
        s = self.name1.split(0)  
        self.assertEqual("example.com.", s.to_text())  
        self.assertRaises(IndexError, self.name1.split, 123)  
        self.assertRaises(IndexError, self.name1.split, 0x10000)  
        self.assertRaises(IndexError, self.name1.split, -123)  
        self.assertRaises(TypeError, self.name1.split, -1)  
  
    def test_reverse(self):  
        self.assertEqual("com.example.", self.name1.reverse().to_text())  
        self.assertEqual(".", self.name2.reverse().to_text())  
  
    def test_concatenate(self):  
        self.assertEqual("example.com.", self.name1.concatenate(self.name2).to_text())  
        self.assertEqual("example.com.example.com.", self.name1.concatenate(self.name1).to_text())  
        self.assertRaises(TypeError, self.name1.concatenate, "wrong")  
        self.assertRaises(TooLongName, self.name1.concatenate, Name("example."*31))  
  
    def test_downcase(self):  
        self.assertEqual("EXAMPLE.com.", self.name4.to_text())  
        self.name4.downcase()  
        self.assertEqual("example.com.", self.name4.to_text())  
  
    def test_is_wildcard(self):  
        self.assertFalse(self.name1.is_wildcard())  
        self.assertTrue(self.name5.is_wildcard())  
  
    def test_richcmp(self):  
        self.assertTrue(self.name1 > self.name2)  
        self.assertFalse(self.name1 < self.name2)  
        self.assertFalse(self.name2 > self.name1)  
        self.assertTrue(self.name2 < self.name1)  
        self.assertTrue(self.name1 == self.name4)  
        self.assertFalse(self.name1 != self.name4)  
        self.assertTrue(self.name1 != self.name2)  
        self.assertFalse(self.name1 == self.name2)  
        self.assertTrue(self.name1 <= self.name4)  
        self.assertTrue(self.name1 >= self.name4)  
        self.assertFalse(self.name1 <= self.name2)  
        self.assertTrue(self.name4 >= self.name1)  
        self.assertTrue(self.name4 <= self.name1)  
        self.assertFalse(self.name2 >= self.name1)  
  
exitif __name__ == '__main__':  
    unittest.main()  
                
             |