name_python_test.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. # Copyright (C) 2010 Internet Systems Consortium.
  2. #
  3. # Permission to use, copy, modify, and distribute this software for any
  4. # purpose with or without fee is hereby granted, provided that the above
  5. # copyright notice and this permission notice appear in all copies.
  6. #
  7. # THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
  8. # DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
  9. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
  10. # INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
  11. # INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
  12. # FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  13. # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
  14. # WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. #
  16. # Tests for the name part of the pydnspp module
  17. #
  18. import unittest
  19. import os
  20. from pydnspp import *
  21. class NameComparisonTest(unittest.TestCase):
  22. def setUp(self):
  23. self.name1 = Name("aaaa.example.com")
  24. self.name2 = Name("bbbb.example.com")
  25. self.name3 = Name("cccc.example.com")
  26. self.name4 = Name("aaaa.example.com")
  27. self.name5 = Name("something.completely.different")
  28. self.ncr12 = self.name1.compare(self.name2)
  29. self.ncr13 = self.name1.compare(self.name3)
  30. self.ncr23 = self.name2.compare(self.name3)
  31. self.ncr21 = self.name2.compare(self.name1)
  32. self.ncr32 = self.name3.compare(self.name2)
  33. self.ncr31 = self.name3.compare(self.name1)
  34. self.ncr14 = self.name1.compare(self.name4)
  35. self.ncr15 = self.name1.compare(self.name5)
  36. def test_init(self):
  37. self.assertRaises(NotImplementedError, NameComparisonResult)
  38. def test_get_order(self):
  39. self.assertEqual(-1, self.ncr12.get_order())
  40. self.assertEqual(-2, self.ncr13.get_order())
  41. self.assertEqual(-1, self.ncr23.get_order())
  42. self.assertEqual(1, self.ncr21.get_order())
  43. self.assertEqual(1, self.ncr32.get_order())
  44. self.assertEqual(2, self.ncr31.get_order())
  45. self.assertEqual(0, self.ncr14.get_order())
  46. def test_get_common_labels(self):
  47. self.assertEqual(3, self.ncr12.get_common_labels())
  48. self.assertEqual(1, self.ncr15.get_common_labels())
  49. def test_get_relation(self):
  50. self.assertEqual("COMMONANCESTOR", NameComparisonResult.NameRelation[self.ncr12.get_relation()])
  51. self.assertEqual("COMMONANCESTOR", NameComparisonResult.NameRelation[self.ncr15.get_relation()])
  52. superdomain = Name("com")
  53. relation = superdomain.compare(self.name1)
  54. self.assertEqual("SUPERDOMAIN", NameComparisonResult.NameRelation[relation.get_relation()])
  55. subdomain = Name("sub.aaaa.example.com")
  56. relation = subdomain.compare(self.name1)
  57. self.assertEqual("SUBDOMAIN", NameComparisonResult.NameRelation[relation.get_relation()])
  58. same = Name("aaaa.example.com")
  59. relation = same.compare(self.name1)
  60. self.assertEqual("EQUAL", NameComparisonResult.NameRelation[relation.get_relation()])
  61. class NameTest(unittest.TestCase):
  62. def setUp(self):
  63. self.name1 = Name("example.com")
  64. self.name2 = Name(".")
  65. self.name3 = Name("something.completely.different")
  66. self.name4 = Name("EXAMPLE.com")
  67. self.name5 = Name("*.example.com")
  68. def test_init(self):
  69. self.assertRaises(EmptyLabel, Name, "example..com")
  70. self.assertRaises(TooLongLabel, Name, "a"*64 + ".example.com")
  71. self.assertRaises(BadLabelType, Name, "\[asdf.example.com")
  72. self.assertRaises(BadEscape, Name, "\\999")
  73. self.assertRaises(TooLongName, Name, "example."*32 + "com")
  74. self.assertRaises(IncompleteName, Name, "\\")
  75. self.assertRaises(TypeError, Name, 1)
  76. b = bytearray()
  77. self.name1.to_wire(b)
  78. self.assertEqual(self.name1, Name(b))
  79. self.assertEqual(self.name1, Name(b, 0))
  80. self.assertRaises(InvalidBufferPosition, Name, b, 100)
  81. b = bytearray()
  82. b += b'\x07example'*32 + b'\x03com\x00'
  83. self.assertRaises(DNSMessageFORMERR, Name, b, 0)
  84. self.assertRaises(IndexError, Name, b, -1)
  85. def test_exception_hierarchy(self):
  86. self.assertTrue(isinstance(EmptyLabel(), NameParserException))
  87. self.assertTrue(isinstance(TooLongLabel(), NameParserException))
  88. self.assertTrue(isinstance(BadLabelType(), NameParserException))
  89. self.assertTrue(isinstance(BadEscape(), NameParserException))
  90. self.assertTrue(isinstance(TooLongName(), NameParserException))
  91. self.assertTrue(isinstance(IncompleteName(), NameParserException))
  92. def test_at(self):
  93. self.assertEqual(7, self.name1.at(0))
  94. self.assertEqual(101, self.name1.at(1))
  95. self.assertRaises(IndexError, self.name1.at, 100)
  96. self.assertRaises(IndexError, self.name1.at, 0x10000)
  97. self.assertRaises(IndexError, self.name1.at, -1)
  98. self.assertRaises(TypeError, self.name1.at, "wrong")
  99. def test_get_length(self):
  100. self.assertEqual(13, self.name1.get_length())
  101. self.assertEqual(1, self.name2.get_length())
  102. self.assertEqual(32, self.name3.get_length())
  103. def test_get_labelcount(self):
  104. self.assertEqual(3, self.name1.get_labelcount())
  105. self.assertEqual(1, self.name2.get_labelcount())
  106. self.assertEqual(4, self.name3.get_labelcount())
  107. def test_to_text(self):
  108. self.assertEqual("example.com.", self.name1.to_text())
  109. self.assertEqual(".", self.name2.to_text())
  110. self.assertEqual(".", str(self.name2))
  111. self.assertEqual("something.completely.different.", self.name3.to_text())
  112. self.assertEqual("example.com.", self.name1.to_text(False))
  113. self.assertEqual("example.com", self.name1.to_text(True))
  114. # make sure it does not behave unexpectedly on wrong arguments
  115. self.assertRaises(TypeError, self.name1.to_text, True, 1)
  116. self.assertRaises(TypeError, self.name1.to_text, 1)
  117. self.assertRaises(TypeError, self.name1.to_text, [])
  118. self.assertRaises(TypeError, self.name1.to_text, "foo")
  119. def test_to_wire(self):
  120. b1 = bytearray()
  121. self.name1.to_wire(b1)
  122. self.assertEqual(bytearray(b'\x07example\x03com\x00'), b1)
  123. b2 = bytearray()
  124. self.name2.to_wire(b2)
  125. self.assertEqual(bytearray(b'\x00'), b2)
  126. mr = MessageRenderer()
  127. self.name1.to_wire(mr)
  128. self.assertEqual(b'\x07example\x03com\x00', mr.get_data())
  129. self.assertRaises(TypeError, self.name1.to_wire, "wrong")
  130. self.assertRaises(TypeError, self.name1.to_wire, 1)
  131. def test_compare(self):
  132. # tested in comparison class above
  133. pass
  134. def test_equals(self):
  135. self.assertFalse(self.name1.equals(self.name2))
  136. self.assertFalse(self.name1.equals(self.name3))
  137. self.assertTrue(self.name1.equals(self.name4))
  138. def test_split(self):
  139. s = self.name1.split(1,1)
  140. self.assertEqual("com.", s.to_text())
  141. s = self.name1.split(0,1)
  142. self.assertEqual("example.", s.to_text())
  143. s = self.name3.split(1,2)
  144. self.assertEqual("completely.different.", s.to_text())
  145. self.assertRaises(TypeError, self.name1.split, "wrong", 1)
  146. self.assertRaises(TypeError, self.name1.split, 1, "wrong")
  147. s = self.name1.split(1)
  148. self.assertEqual("com.", s.to_text())
  149. # Range check. We need to do this at the binding level, so we need
  150. # explicit tests for it.
  151. self.assertRaises(IndexError, self.name1.split, 123, 1)
  152. self.assertRaises(IndexError, self.name1.split, 1, 123)
  153. self.assertRaises(IndexError, self.name1.split, 0x10000, 5)
  154. self.assertRaises(IndexError, self.name1.split, -1, -1)
  155. self.assertRaises(IndexError, self.name1.split, 0, -1)
  156. self.assertRaises(IndexError, self.name1.split, -1, 0x10000)
  157. s = self.name1.split(0)
  158. self.assertEqual("example.com.", s.to_text())
  159. self.assertRaises(IndexError, self.name1.split, 123)
  160. self.assertRaises(IndexError, self.name1.split, 0x10000)
  161. self.assertRaises(IndexError, self.name1.split, -123)
  162. self.assertRaises(TypeError, self.name1.split, -1)
  163. def test_reverse(self):
  164. self.assertEqual("com.example.", self.name1.reverse().to_text())
  165. self.assertEqual(".", self.name2.reverse().to_text())
  166. def test_concatenate(self):
  167. self.assertEqual("example.com.", self.name1.concatenate(self.name2).to_text())
  168. self.assertEqual("example.com.example.com.", self.name1.concatenate(self.name1).to_text())
  169. self.assertRaises(TypeError, self.name1.concatenate, "wrong")
  170. self.assertRaises(TooLongName, self.name1.concatenate, Name("example."*31))
  171. def test_downcase(self):
  172. self.assertEqual("EXAMPLE.com.", self.name4.to_text())
  173. self.name4.downcase()
  174. self.assertEqual("example.com.", self.name4.to_text())
  175. def test_is_wildcard(self):
  176. self.assertFalse(self.name1.is_wildcard())
  177. self.assertTrue(self.name5.is_wildcard())
  178. def test_richcmp(self):
  179. self.assertTrue(self.name1 > self.name2)
  180. self.assertFalse(self.name1 < self.name2)
  181. self.assertFalse(self.name2 > self.name1)
  182. self.assertTrue(self.name2 < self.name1)
  183. self.assertTrue(self.name1 == self.name4)
  184. self.assertFalse(self.name1 != self.name4)
  185. self.assertTrue(self.name1 != self.name2)
  186. self.assertFalse(self.name1 == self.name2)
  187. self.assertTrue(self.name1 <= self.name4)
  188. self.assertTrue(self.name1 >= self.name4)
  189. self.assertFalse(self.name1 <= self.name2)
  190. self.assertTrue(self.name4 >= self.name1)
  191. self.assertTrue(self.name4 <= self.name1)
  192. self.assertFalse(self.name2 >= self.name1)
  193. def test_hash(self):
  194. # The same name should have the same hash value.
  195. self.assertEqual(hash(Name('example.com')), hash(Name('example.com')))
  196. # Hash is case insensitive.
  197. self.assertEqual(hash(Name('example.com')), hash(Name('EXAMPLE.COM')))
  198. # These pairs happen to be known to have different hashes.
  199. # It may be naive to assume the hash value is always the same (we use
  200. # an external library and it depends on its internal details). If
  201. # it turns out that this assumption isn't always held, we should
  202. # disable this test.
  203. self.assertNotEqual(hash(Name('example.com')),
  204. hash(Name('example.org')))
  205. # Check insensitiveness for the case of inequality.
  206. # Based on the assumption above, this 'if' should be true and
  207. # we'll always test the case inside it. We'll still keep the if in
  208. # case we end up disabling the above test.
  209. if hash(Name('example.com')) != hash(Name('example.org')):
  210. self.assertNotEqual(hash(Name('example.com')),
  211. hash(Name('EXAMPLE.ORG')))
  212. if __name__ == '__main__':
  213. unittest.main()