data_test.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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 functions in data.py
  17. #
  18. import unittest
  19. import os
  20. from isc.cc import data
  21. class TestData(unittest.TestCase):
  22. def test_remove_identical(self):
  23. a = {}
  24. b = {}
  25. c = {}
  26. data.remove_identical(a, b)
  27. self.assertEqual(a, c)
  28. a = { "a": 1 }
  29. b = { "a": 1 }
  30. c = {}
  31. data.remove_identical(a, b)
  32. self.assertEqual(a, c)
  33. a = { "a": 1, "b": [ 1, 2 ] }
  34. b = {}
  35. c = { "a": 1, "b": [ 1, 2 ] }
  36. data.remove_identical(a, b)
  37. self.assertEqual(a, c)
  38. a = { "a": 1, "b": [ 1, 2 ] }
  39. b = { "a": 1, "b": [ 1, 2 ] }
  40. c = {}
  41. data.remove_identical(a, b)
  42. self.assertEqual(a, c)
  43. a = { "a": 1, "b": [ 1, 2 ] }
  44. b = { "a": 1, "b": [ 1, 3 ] }
  45. c = { "b": [ 1, 2 ] }
  46. data.remove_identical(a, b)
  47. self.assertEqual(a, c)
  48. a = { "a": { "b": "c" } }
  49. b = {}
  50. c = { "a": { "b": "c" } }
  51. data.remove_identical(a, b)
  52. self.assertEqual(a, c)
  53. a = { "a": { "b": "c" } }
  54. b = { "a": { "b": "c" } }
  55. c = {}
  56. data.remove_identical(a, b)
  57. self.assertEqual(a, c)
  58. a = { "a": { "b": "c" } }
  59. b = { "a": { "b": "d" } }
  60. c = { "a": { "b": "c" } }
  61. data.remove_identical(a, b)
  62. self.assertEqual(a, c)
  63. self.assertRaises(data.DataTypeError, data.remove_identical,
  64. a, 1)
  65. self.assertRaises(data.DataTypeError, data.remove_identical,
  66. 1, b)
  67. def test_merge(self):
  68. d1 = { 'a': 'a', 'b': 1, 'c': { 'd': 'd', 'e': 2 } }
  69. d2 = { 'a': None, 'c': { 'd': None, 'e': 3, 'f': [ 1 ] } }
  70. d12 = { 'b': 1, 'c': { 'e': 3, 'f': [ 1 ] } }
  71. m12 = d1
  72. data.merge(m12, d2)
  73. self.assertEqual(d12, m12)
  74. self.assertRaises(data.DataTypeError, data.merge, d1, "a")
  75. self.assertRaises(data.DataTypeError, data.merge, 1, d2)
  76. self.assertRaises(data.DataTypeError, data.merge, None, None)
  77. def test_split_identifier_list_indices(self):
  78. id, indices = data.split_identifier_list_indices('a')
  79. self.assertEqual(id, 'a')
  80. self.assertEqual(indices, None)
  81. id, indices = data.split_identifier_list_indices('a[0]')
  82. self.assertEqual(id, 'a')
  83. self.assertEqual(indices, [0])
  84. id, indices = data.split_identifier_list_indices('a[0][1]')
  85. self.assertEqual(id, 'a')
  86. self.assertEqual(indices, [0, 1])
  87. # bad formats
  88. self.assertRaises(data.DataTypeError, data.split_identifier_list_indices, 'a[')
  89. self.assertRaises(data.DataTypeError, data.split_identifier_list_indices, 'a]')
  90. self.assertRaises(data.DataTypeError, data.split_identifier_list_indices, 'a[[0]]')
  91. self.assertRaises(data.DataTypeError, data.split_identifier_list_indices, 'a[0]a')
  92. self.assertRaises(data.DataTypeError, data.split_identifier_list_indices, 'a[0]a[1]')
  93. self.assertRaises(data.DataTypeError, data.split_identifier_list_indices, 1)
  94. def test_find(self):
  95. d1 = { 'a': 'a', 'b': 1, 'c': { 'd': 'd', 'e': 2, 'more': { 'data': 'here' } } }
  96. self.assertEqual(data.find(d1, ''), d1)
  97. self.assertEqual(data.find(d1, 'a'), 'a')
  98. self.assertEqual(data.find(d1, 'c/e'), 2)
  99. self.assertEqual(data.find(d1, 'c/more/'), { 'data': 'here' })
  100. self.assertEqual(data.find(d1, 'c/more/data'), 'here')
  101. self.assertRaises(data.DataNotFoundError, data.find, d1, 'c/f')
  102. self.assertRaises(data.DataNotFoundError, data.find, d1, 'f')
  103. self.assertRaises(data.DataTypeError, data.find, d1, 1)
  104. self.assertRaises(data.DataTypeError, data.find, None, 1)
  105. self.assertRaises(data.DataTypeError, data.find, "123", "123")
  106. self.assertEqual(data.find("123", ""), "123")
  107. d2 = { 'a': [ 1, 2, 3 ] }
  108. self.assertEqual(data.find(d2, 'a[0]'), 1)
  109. self.assertEqual(data.find(d2, 'a[1]'), 2)
  110. self.assertEqual(data.find(d2, 'a[2]'), 3)
  111. self.assertRaises(data.DataNotFoundError, data.find, d2, 'a[3]')
  112. self.assertRaises(data.DataTypeError, data.find, d2, 'a[a]')
  113. d3 = { 'a': [ { 'b': [ {}, { 'c': 'd' } ] } ] }
  114. self.assertEqual(data.find(d3, 'a[0]/b[1]/c'), 'd')
  115. self.assertRaises(data.DataNotFoundError, data.find, d3, 'a[1]/b[1]/c')
  116. def test_set(self):
  117. d1 = { 'a': 'a', 'b': 1, 'c': { 'd': 'd', 'e': 2 } }
  118. d12 = { 'b': 1, 'c': { 'e': 3, 'f': [ 1 ] } }
  119. d13 = { 'b': 1, 'c': { 'e': 3, 'f': [ 2 ] } }
  120. d14 = { 'b': 1, 'c': { 'e': 3, 'f': [ { 'g': [ 1, 2 ] } ] } }
  121. d15 = { 'b': 1, 'c': { 'e': 3, 'f': [ { 'g': [ 1, 3 ] } ] } }
  122. data.set(d1, 'a', None)
  123. data.set(d1, 'c/d', None)
  124. data.set(d1, 'c/e/', 3)
  125. data.set(d1, 'c/f', [ 1 ] )
  126. self.assertEqual(d1, d12)
  127. data.set(d1, 'c/f[0]', 2 )
  128. self.assertEqual(d1, d13)
  129. data.set(d1, 'c/f[0]', { 'g': [ 1, 2] } )
  130. self.assertEqual(d1, d14)
  131. data.set(d1, 'c/f[0]/g[1]', 3)
  132. self.assertEqual(d1, d15)
  133. self.assertRaises(data.DataTypeError, data.set, d1, 1, 2)
  134. self.assertRaises(data.DataTypeError, data.set, 1, "", 2)
  135. self.assertRaises(data.DataTypeError, data.set, d1, 'c[1]', 2)
  136. self.assertRaises(data.DataTypeError, data.set, d1, 'c[1][2]', 2)
  137. self.assertRaises(data.DataNotFoundError, data.set, d1, 'c/f[5]', 2)
  138. self.assertRaises(data.DataNotFoundError, data.set, d1, 'c/f[5][2]', 2)
  139. d3 = {}
  140. e3 = data.set(d3, "does/not/exist", 123)
  141. self.assertEqual(d3,
  142. { 'does': { 'not': { 'exist': 123 } } })
  143. self.assertEqual(e3,
  144. { 'does': { 'not': { 'exist': 123 } } })
  145. def test_unset(self):
  146. d1 = { 'a': 'a', 'b': 1, 'c': { 'd': 'd', 'e': [ 1, 2, 3 ] } }
  147. data.unset(d1, 'a')
  148. data.unset(d1, 'c/d')
  149. data.unset(d1, 'does/not/exist')
  150. self.assertEqual(d1, { 'b': 1, 'c': { 'e': [ 1, 2, 3 ] } })
  151. data.unset(d1, 'c/e[0]')
  152. self.assertEqual(d1, { 'b': 1, 'c': { 'e': [ 2, 3 ] } })
  153. data.unset(d1, 'c/e[1]')
  154. self.assertEqual(d1, { 'b': 1, 'c': { 'e': [ 2 ] } })
  155. # index 1 should now be out of range
  156. self.assertRaises(data.DataNotFoundError, data.unset, d1, 'c/e[1]')
  157. d2 = { 'a': [ { 'b': [ 1, 2 ] } ] }
  158. data.unset(d2, 'a[0]/b[1]')
  159. self.assertEqual(d2, { 'a': [ { 'b': [ 1 ] } ] })
  160. d3 = { 'a': [ [ 1, 2 ] ] }
  161. data.set(d3, "a[0][1]", 3)
  162. self.assertEqual(d3, { 'a': [ [ 1, 3 ] ] })
  163. data.unset(d3, 'a[0][1]')
  164. self.assertEqual(d3, { 'a': [ [ 1 ] ] })
  165. def test_find_no_exc(self):
  166. d1 = { 'a': 'a', 'b': 1, 'c': { 'd': 'd', 'e': 2, 'more': { 'data': 'here' } } }
  167. self.assertEqual(data.find_no_exc(d1, ''), d1)
  168. self.assertEqual(data.find_no_exc(d1, 'a'), 'a')
  169. self.assertEqual(data.find_no_exc(d1, 'c/e'), 2)
  170. self.assertEqual(data.find_no_exc(d1, 'c/more/'), { 'data': 'here' })
  171. self.assertEqual(data.find_no_exc(d1, 'c/more/data'), 'here')
  172. self.assertEqual(data.find_no_exc(d1, 'c/f'), None)
  173. self.assertEqual(data.find_no_exc(d1, 'f'), None)
  174. self.assertEqual(data.find_no_exc(d1, 1), None)
  175. self.assertEqual(data.find_no_exc(d1, 'more/data/here'), None)
  176. self.assertEqual(data.find_no_exc(None, 1), None)
  177. self.assertEqual(data.find_no_exc("123", ""), "123")
  178. self.assertEqual(data.find_no_exc("123", ""), "123")
  179. def test_parse_value_str(self):
  180. self.assertEqual(data.parse_value_str("1"), 1)
  181. self.assertEqual(data.parse_value_str("true"), True)
  182. self.assertEqual(data.parse_value_str("null"), None)
  183. self.assertEqual(data.parse_value_str("1.1"), 1.1)
  184. self.assertEqual(data.parse_value_str("[]"), [])
  185. self.assertEqual(data.parse_value_str("[ 1, null, \"asdf\" ]"), [ 1, None, "asdf" ])
  186. self.assertEqual(data.parse_value_str("{}"), {})
  187. self.assertEqual(data.parse_value_str("{ \"a\": \"b\", \"c\": 1 }"), { 'a': 'b', 'c': 1 })
  188. self.assertEqual(data.parse_value_str("[ a c"), "[ a c")
  189. self.assertEqual(data.parse_value_str(1), None)
  190. if __name__ == '__main__':
  191. #if not 'CONFIG_TESTDATA_PATH' in os.environ:
  192. # print("You need to set the environment variable CONFIG_TESTDATA_PATH to point to the directory containing the test data files")
  193. # exit(1)
  194. unittest.main()