name_python_test.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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 messagerenderer 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_at(self):
  86. self.assertEqual(7, self.name1.at(0))
  87. self.assertEqual(101, self.name1.at(1))
  88. self.assertRaises(IndexError, self.name1.at, 100)
  89. self.assertRaises(IndexError, self.name1.at, 0x10000)
  90. self.assertRaises(IndexError, self.name1.at, -1)
  91. self.assertRaises(TypeError, self.name1.at, "wrong")
  92. def test_get_length(self):
  93. self.assertEqual(13, self.name1.get_length())
  94. self.assertEqual(1, self.name2.get_length())
  95. self.assertEqual(32, self.name3.get_length())
  96. def test_get_labelcount(self):
  97. self.assertEqual(3, self.name1.get_labelcount())
  98. self.assertEqual(1, self.name2.get_labelcount())
  99. self.assertEqual(4, self.name3.get_labelcount())
  100. def test_to_text(self):
  101. self.assertEqual("example.com.", self.name1.to_text())
  102. self.assertEqual(".", self.name2.to_text())
  103. self.assertEqual(".", str(self.name2))
  104. self.assertEqual("something.completely.different.", self.name3.to_text())
  105. def test_to_wire(self):
  106. b1 = bytearray()
  107. self.name1.to_wire(b1)
  108. self.assertEqual(bytearray(b'\x07example\x03com\x00'), b1)
  109. b2 = bytearray()
  110. self.name2.to_wire(b2)
  111. self.assertEqual(bytearray(b'\x00'), b2)
  112. mr = MessageRenderer()
  113. self.name1.to_wire(mr)
  114. self.assertEqual(b'\x07example\x03com\x00', mr.get_data())
  115. self.assertRaises(TypeError, self.name1.to_wire, "wrong")
  116. self.assertRaises(TypeError, self.name1.to_wire, 1)
  117. def test_compare(self):
  118. # tested in comparison class above
  119. pass
  120. def test_equals(self):
  121. self.assertFalse(self.name1.equals(self.name2))
  122. self.assertFalse(self.name1.equals(self.name3))
  123. self.assertTrue(self.name1.equals(self.name4))
  124. def test_split(self):
  125. s = self.name1.split(1,1)
  126. self.assertEqual("com.", s.to_text())
  127. s = self.name1.split(0,1)
  128. self.assertEqual("example.", s.to_text())
  129. s = self.name3.split(1,2)
  130. self.assertEqual("completely.different.", s.to_text())
  131. self.assertRaises(TypeError, self.name1.split, "wrong", 1)
  132. self.assertRaises(TypeError, self.name1.split, 1, "wrong")
  133. s = self.name1.split(1)
  134. self.assertEqual("com.", s.to_text())
  135. # Range check. We need to do this at the binding level, so we need
  136. # explicit tests for it.
  137. self.assertRaises(IndexError, self.name1.split, 123, 1)
  138. self.assertRaises(IndexError, self.name1.split, 1, 123)
  139. self.assertRaises(IndexError, self.name1.split, 0x10000, 5)
  140. self.assertRaises(IndexError, self.name1.split, -1, -1)
  141. self.assertRaises(IndexError, self.name1.split, 0, -1)
  142. self.assertRaises(IndexError, self.name1.split, -1, 0x10000)
  143. s = self.name1.split(0)
  144. self.assertEqual("example.com.", s.to_text())
  145. self.assertRaises(IndexError, self.name1.split, 123)
  146. self.assertRaises(IndexError, self.name1.split, 0x10000)
  147. self.assertRaises(IndexError, self.name1.split, -123)
  148. self.assertRaises(TypeError, self.name1.split, -1)
  149. def test_reverse(self):
  150. self.assertEqual("com.example.", self.name1.reverse().to_text())
  151. self.assertEqual(".", self.name2.reverse().to_text())
  152. def test_concatenate(self):
  153. self.assertEqual("example.com.", self.name1.concatenate(self.name2).to_text())
  154. self.assertEqual("example.com.example.com.", self.name1.concatenate(self.name1).to_text())
  155. self.assertRaises(TypeError, self.name1.concatenate, "wrong")
  156. self.assertRaises(TooLongName, self.name1.concatenate, Name("example."*31))
  157. def test_downcase(self):
  158. self.assertEqual("EXAMPLE.com.", self.name4.to_text())
  159. self.name4.downcase()
  160. self.assertEqual("example.com.", self.name4.to_text())
  161. def test_is_wildcard(self):
  162. self.assertFalse(self.name1.is_wildcard())
  163. self.assertTrue(self.name5.is_wildcard())
  164. def test_richcmp(self):
  165. self.assertTrue(self.name1 > self.name2)
  166. self.assertFalse(self.name1 < self.name2)
  167. self.assertFalse(self.name2 > self.name1)
  168. self.assertTrue(self.name2 < self.name1)
  169. self.assertTrue(self.name1 == self.name4)
  170. self.assertFalse(self.name1 != self.name4)
  171. self.assertTrue(self.name1 != self.name2)
  172. self.assertFalse(self.name1 == self.name2)
  173. self.assertTrue(self.name1 <= self.name4)
  174. self.assertTrue(self.name1 >= self.name4)
  175. self.assertFalse(self.name1 <= self.name2)
  176. self.assertTrue(self.name4 >= self.name1)
  177. self.assertTrue(self.name4 <= self.name1)
  178. self.assertFalse(self.name2 >= self.name1)
  179. if __name__ == '__main__':
  180. unittest.main()