module_spec_test.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. # Copyright (C) 2009 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. # $Id$
  16. #
  17. # Tests for the module_spec module
  18. #
  19. import unittest
  20. import os
  21. from isc.config import ModuleSpec, ModuleSpecError
  22. import isc.cc.data
  23. class TestModuleSpec(unittest.TestCase):
  24. def setUp(self):
  25. if 'CONFIG_TESTDATA_PATH' in os.environ:
  26. self.data_path = os.environ['CONFIG_TESTDATA_PATH']
  27. else:
  28. self.data_path = "../../../testdata"
  29. def spec_file(self, filename):
  30. return(self.data_path + os.sep + filename)
  31. def read_spec_file(self, filename):
  32. return isc.config.module_spec_from_file(self.spec_file(filename))
  33. def spec1(self, dd):
  34. module_spec = dd.get_full_spec()
  35. self.assert_('module_name' in module_spec)
  36. self.assertEqual(module_spec['module_name'], "Spec1")
  37. def test_open_file_name(self):
  38. dd = self.read_spec_file("spec1.spec")
  39. self.spec1(dd)
  40. def test_open_file_obj(self):
  41. file1 = open(self.spec_file("spec1.spec"))
  42. dd = isc.config.module_spec_from_file(file1)
  43. self.spec1(dd)
  44. def test_open_bad_file_obj(self):
  45. self.assertRaises(ModuleSpecError, isc.config.module_spec_from_file, 1)
  46. def test_bad_specfiles(self):
  47. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec3.spec")
  48. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec4.spec")
  49. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec5.spec")
  50. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec6.spec")
  51. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec7.spec")
  52. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec8.spec")
  53. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec9.spec")
  54. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec10.spec")
  55. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec11.spec")
  56. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec12.spec")
  57. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec13.spec")
  58. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec14.spec")
  59. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec15.spec")
  60. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec16.spec")
  61. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec17.spec")
  62. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec18.spec")
  63. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec19.spec")
  64. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec20.spec")
  65. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec21.spec")
  66. self.assertRaises(ModuleSpecError, self.read_spec_file, "spec26.spec")
  67. def validate_data(self, specfile_name, datafile_name):
  68. dd = self.read_spec_file(specfile_name);
  69. data_file = open(self.spec_file(datafile_name))
  70. data_str = data_file.read()
  71. data = isc.cc.data.parse_value_str(data_str)
  72. return dd.validate_config(True, data)
  73. def test_data_validation(self):
  74. self.assertEqual(True, self.validate_data("spec22.spec", "data22_1.data"))
  75. self.assertEqual(False, self.validate_data("spec22.spec", "data22_2.data"))
  76. self.assertEqual(False, self.validate_data("spec22.spec", "data22_3.data"))
  77. self.assertEqual(False, self.validate_data("spec22.spec", "data22_4.data"))
  78. self.assertEqual(False, self.validate_data("spec22.spec", "data22_5.data"))
  79. self.assertEqual(True, self.validate_data("spec22.spec", "data22_6.data"))
  80. self.assertEqual(True, self.validate_data("spec22.spec", "data22_7.data"))
  81. self.assertEqual(False, self.validate_data("spec22.spec", "data22_8.data"))
  82. def validate_command_params(self, specfile_name, datafile_name, cmd_name):
  83. dd = self.read_spec_file(specfile_name);
  84. data_file = open(self.spec_file(datafile_name))
  85. data_str = data_file.read()
  86. params = isc.cc.data.parse_value_str(data_str)
  87. return dd.validate_command(cmd_name, params)
  88. def test_command_validation(self):
  89. self.assertEqual(True, self.validate_command_params("spec27.spec", "data22_1.data", 'cmd1'))
  90. self.assertEqual(False, self.validate_command_params("spec27.spec", "data22_2.data",'cmd1'))
  91. self.assertEqual(False, self.validate_command_params("spec27.spec", "data22_3.data", 'cmd1'))
  92. self.assertEqual(False, self.validate_command_params("spec27.spec", "data22_4.data", 'cmd1'))
  93. self.assertEqual(False, self.validate_command_params("spec27.spec", "data22_5.data", 'cmd1'))
  94. self.assertEqual(True, self.validate_command_params("spec27.spec", "data22_6.data", 'cmd1'))
  95. self.assertEqual(True, self.validate_command_params("spec27.spec", "data22_7.data", 'cmd1'))
  96. self.assertEqual(False, self.validate_command_params("spec27.spec", "data22_8.data", 'cmd1'))
  97. self.assertEqual(False, self.validate_command_params("spec27.spec", "data22_8.data", 'cmd2'))
  98. def test_init(self):
  99. self.assertRaises(ModuleSpecError, ModuleSpec, 1)
  100. module_spec = isc.config.module_spec_from_file(self.spec_file("spec1.spec"), False)
  101. self.spec1(module_spec)
  102. module_spec = isc.config.module_spec_from_file(self.spec_file("spec25.spec"), True)
  103. self.assertEqual("Spec25", module_spec.get_module_name())
  104. self.assertEqual("Just an empty module", module_spec.get_module_description())
  105. def test_str(self):
  106. module_spec = isc.config.module_spec_from_file(self.spec_file("spec1.spec"), False)
  107. self.assertEqual(module_spec.__str__(), "{'module_name': 'Spec1'}")
  108. def test_check_module_spec(self):
  109. self.assertRaises(ModuleSpecError, isc.config.module_spec._check, 1)
  110. def test_check_command_spec(self):
  111. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_command_spec, 1 )
  112. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_command_spec, [ 1 ] )
  113. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_command_spec,
  114. [ { 'command_name': 1,
  115. 'command_description': 'just for testing',
  116. 'command_args': [
  117. { 'item_name': 'arg1',
  118. 'item_type': 'string',
  119. 'item_optional': True
  120. }
  121. ]
  122. }
  123. ]
  124. )
  125. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_command_spec,
  126. [ { 'command_name': 'test_command',
  127. 'command_description': 1,
  128. 'command_args': [
  129. { 'item_name': 'arg1',
  130. 'item_type': 'string',
  131. 'item_optional': True
  132. }
  133. ]
  134. }
  135. ]
  136. )
  137. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_command_spec,
  138. [ { 'command_name': 'test_command',
  139. 'command_args': [ 1 ]
  140. }
  141. ]
  142. )
  143. def test_check_item_spec(self):
  144. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec, 1 )
  145. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  146. { 'item_name': 1,
  147. 'item_type': "string",
  148. 'item_optional': False,
  149. 'item_default': "asdf"
  150. }
  151. )
  152. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  153. { 'item_name': "an_item",
  154. 'item_type': "bad_type",
  155. 'item_optional': False,
  156. 'item_default': "asdf"
  157. }
  158. )
  159. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  160. { 'item_name': "an_item",
  161. 'item_type': 1,
  162. 'item_optional': False,
  163. 'item_default': "asdf"
  164. }
  165. )
  166. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  167. { 'item_name': "an_item",
  168. 'item_type': "string",
  169. 'item_optional': False,
  170. }
  171. )
  172. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  173. { 'item_name': "an_item",
  174. 'item_type': "string",
  175. 'item_optional': 1,
  176. }
  177. )
  178. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  179. { 'item_name': "an_item",
  180. 'item_type': "string",
  181. 'item_optional': False,
  182. 'item_default': 1
  183. }
  184. )
  185. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  186. { 'item_name': "an_item",
  187. 'item_type': "list",
  188. 'item_optional': False,
  189. 'item_default': []
  190. }
  191. )
  192. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  193. { 'item_name': "an_item",
  194. 'item_type': "list",
  195. 'item_optional': False,
  196. 'item_default': [],
  197. 'list_item_spec': 1
  198. }
  199. )
  200. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  201. { 'item_name': "an_item",
  202. 'item_type': "map",
  203. 'item_optional': False,
  204. 'item_default': {}
  205. }
  206. )
  207. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  208. { 'item_name': "an_item",
  209. 'item_type': "map",
  210. 'item_optional': False,
  211. 'item_default': {},
  212. 'map_item_spec': 1
  213. }
  214. )
  215. self.assertRaises(ModuleSpecError, isc.config.module_spec._check_item_spec,
  216. { 'item_name': "an_item",
  217. 'item_type': "map",
  218. 'item_optional': False,
  219. 'item_default': {},
  220. 'map_item_spec': [ 1 ]
  221. }
  222. )
  223. def test_validate_type(self):
  224. errors = []
  225. self.assertEqual(True, isc.config.module_spec._validate_type({ 'item_type': 'integer' }, 1, errors))
  226. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'integer' }, "a", None))
  227. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'integer' }, "a", errors))
  228. self.assertEqual(['a should be an integer'], errors)
  229. errors = []
  230. self.assertEqual(True, isc.config.module_spec._validate_type({ 'item_type': 'real' }, 1.1, errors))
  231. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'real' }, "a", None))
  232. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'real' }, "a", errors))
  233. self.assertEqual(['a should be a real'], errors)
  234. errors = []
  235. self.assertEqual(True, isc.config.module_spec._validate_type({ 'item_type': 'boolean' }, True, errors))
  236. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'boolean' }, "a", None))
  237. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'boolean' }, "a", errors))
  238. self.assertEqual(['a should be a boolean'], errors)
  239. errors = []
  240. self.assertEqual(True, isc.config.module_spec._validate_type({ 'item_type': 'string' }, "a", errors))
  241. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'string' }, 1, None))
  242. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'string' }, 1, errors))
  243. self.assertEqual(['1 should be a string'], errors)
  244. errors = []
  245. self.assertEqual(True, isc.config.module_spec._validate_type({ 'item_type': 'list' }, [ 1, 1], errors))
  246. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'list' }, 1, None))
  247. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'list' }, 1, errors))
  248. self.assertEqual(['1 should be a list'], errors)
  249. errors = []
  250. self.assertEqual(True, isc.config.module_spec._validate_type({ 'item_type': 'map' }, {"a": 1}, errors))
  251. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'map' }, 1, None))
  252. self.assertEqual(False, isc.config.module_spec._validate_type({ 'item_type': 'map' }, 1, errors))
  253. self.assertEqual(['1 should be a map'], errors)
  254. def test_validate_spec(self):
  255. spec = { 'item_name': "an_item",
  256. 'item_type': "string",
  257. 'item_optional': False,
  258. 'item_default': "asdf"
  259. }
  260. errors = []
  261. self.assertEqual(False, isc.config.module_spec._validate_spec(spec, True, {}, None))
  262. self.assertEqual(False, isc.config.module_spec._validate_spec(spec, True, {}, errors))
  263. self.assertEqual(['non-optional item an_item missing'], errors)
  264. if __name__ == '__main__':
  265. unittest.main()