config_data_test.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  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. # $Id$
  16. #
  17. # Tests for the ConfigData and MultiConfigData classes
  18. #
  19. import unittest
  20. import os
  21. from isc.config.config_data import *
  22. from isc.config.module_spec import *
  23. class TestConfigData(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. spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  30. self.cd = ConfigData(spec)
  31. #def test_module_spec_from_file(self):
  32. # spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec1.spec")
  33. # cd = ConfigData(spec)
  34. # self.assertEqual(cd.specification, spec)
  35. # self.assertEqual(cd.data, {})
  36. # self.assertRaises(ConfigDataError, ConfigData, 1)
  37. def test_check_type(self):
  38. config_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec22.spec").get_config_spec()
  39. spec_part = find_spec_part(config_spec, "value1")
  40. check_type(spec_part, 1)
  41. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1.1)
  42. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, True)
  43. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, "a")
  44. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, [ 1, 2 ])
  45. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, { "a": 1 })
  46. spec_part = find_spec_part(config_spec, "value2")
  47. check_type(spec_part, 1.1)
  48. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1)
  49. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, True)
  50. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, "a")
  51. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, [ 1, 2 ])
  52. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, { "a": 1 })
  53. spec_part = find_spec_part(config_spec, "value3")
  54. check_type(spec_part, True)
  55. check_type(spec_part, False)
  56. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1)
  57. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1.1)
  58. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, "a")
  59. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, [ 1, 2 ])
  60. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, { "a": 1 })
  61. spec_part = find_spec_part(config_spec, "value4")
  62. check_type(spec_part, "asdf")
  63. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1)
  64. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1.1)
  65. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, True)
  66. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, [ 1, 2 ])
  67. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, { "a": 1 })
  68. spec_part = find_spec_part(config_spec, "value5")
  69. check_type(spec_part, [1, 2])
  70. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1)
  71. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1.1)
  72. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, True)
  73. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, "a")
  74. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, [ "a", "b" ])
  75. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, { "a": 1 })
  76. spec_part = find_spec_part(config_spec, "value6")
  77. check_type(spec_part, { "value1": "aaa", "value2": 2 })
  78. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1)
  79. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, 1.1)
  80. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, True)
  81. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, "a")
  82. self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, [ 1, 2 ])
  83. #self.assertRaises(isc.cc.data.DataTypeError, check_type, spec_part, { "value1": 1 })
  84. self.assertRaises(isc.cc.data.DataTypeError, check_type, config_spec, 1)
  85. def test_convert_type(self):
  86. config_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec22.spec").get_config_spec()
  87. spec_part = find_spec_part(config_spec, "value1")
  88. self.assertEqual(1, convert_type(spec_part, '1'))
  89. self.assertEqual(2, convert_type(spec_part, 2.1))
  90. self.assertEqual(2, convert_type(spec_part, '2'))
  91. self.assertEqual(3, convert_type(spec_part, '3'))
  92. self.assertEqual(1, convert_type(spec_part, True))
  93. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, "a")
  94. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, [ 1, 2 ])
  95. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, { "a": 1 })
  96. self.assertRaises(isc.cc.data.DataTypeError, convert_type, 1, "a")
  97. self.assertRaises(isc.cc.data.DataTypeError, convert_type, { 'somedict': 'somevalue' }, "a")
  98. spec_part = find_spec_part(config_spec, "value2")
  99. self.assertEqual(1.1, convert_type(spec_part, '1.1'))
  100. self.assertEqual(123.0, convert_type(spec_part, '123'))
  101. self.assertEqual(1.0, convert_type(spec_part, True))
  102. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, "a")
  103. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, [ 1, 2 ])
  104. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, { "a": 1 })
  105. spec_part = find_spec_part(config_spec, "value3")
  106. self.assertEqual(True, convert_type(spec_part, 'True'))
  107. self.assertEqual(False, convert_type(spec_part, 'False'))
  108. self.assertEqual(True, convert_type(spec_part, 1))
  109. self.assertEqual(True, convert_type(spec_part, 1.1))
  110. self.assertEqual(True, convert_type(spec_part, 'a'))
  111. self.assertEqual(True, convert_type(spec_part, [1, 2]))
  112. self.assertEqual(True, convert_type(spec_part, {'a' : 1}))
  113. spec_part = find_spec_part(config_spec, "value4")
  114. self.assertEqual('asdf', convert_type(spec_part, "asdf"))
  115. self.assertEqual('1', convert_type(spec_part, 1))
  116. self.assertEqual('1.1', convert_type(spec_part, 1.1))
  117. self.assertEqual('True', convert_type(spec_part, True))
  118. spec_part = find_spec_part(config_spec, "value5")
  119. self.assertEqual([1, 2], convert_type(spec_part, '1, 2'))
  120. self.assertEqual([1, 2, 3], convert_type(spec_part, '1 2 3'))
  121. self.assertEqual([1, 2, 3,4], convert_type(spec_part, '1 2 3, 4'))
  122. self.assertEqual([1], convert_type(spec_part, [1,]))
  123. self.assertEqual([1,2], convert_type(spec_part, [1,2]))
  124. self.assertEqual([1,2], convert_type(spec_part, ['1', '2']))
  125. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, 1.1)
  126. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, True)
  127. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, "a")
  128. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, [ "a", "b" ])
  129. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, [ "1", "b" ])
  130. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, { "a": 1 })
  131. spec_part = find_spec_part(config_spec, "value6")
  132. self.assertEqual({}, convert_type(spec_part, '{}'))
  133. self.assertEqual({ 'v61': 'a' }, convert_type(spec_part, '{ \'v61\': \'a\' }'))
  134. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, 1.1)
  135. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, True)
  136. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, "a")
  137. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, "1")
  138. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, [ "a", "b" ])
  139. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, [ "1", "b" ])
  140. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, { "a": 1 })
  141. spec_part = find_spec_part(config_spec, "value7")
  142. self.assertEqual(['1', '2'], convert_type(spec_part, '1, 2'))
  143. self.assertEqual(['1', '2', '3'], convert_type(spec_part, '1 2 3'))
  144. self.assertEqual(['1', '2', '3','4'], convert_type(spec_part, '1 2 3, 4'))
  145. self.assertEqual([1], convert_type(spec_part, [1,]))
  146. self.assertEqual([1,2], convert_type(spec_part, [1,2]))
  147. self.assertEqual(['1','2'], convert_type(spec_part, ['1', '2']))
  148. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, 1.1)
  149. self.assertRaises(isc.cc.data.DataTypeError, convert_type, spec_part, True)
  150. self.assertEqual(['a'], convert_type(spec_part, "a"))
  151. self.assertEqual(['a', 'b'], convert_type(spec_part, ["a", "b" ]))
  152. self.assertEqual([1, 'b'], convert_type(spec_part, [1, "b" ]))
  153. def test_find_spec_part(self):
  154. config_spec = self.cd.get_module_spec().get_config_spec()
  155. spec_part = find_spec_part(config_spec, "item1")
  156. self.assertEqual({'item_name': 'item1', 'item_type': 'integer', 'item_optional': False, 'item_default': 1, }, spec_part)
  157. spec_part = find_spec_part(config_spec, "/item1")
  158. self.assertEqual({'item_name': 'item1', 'item_type': 'integer', 'item_optional': False, 'item_default': 1, }, spec_part)
  159. self.assertRaises(isc.cc.data.DataNotFoundError, find_spec_part, config_spec, "no_such_item")
  160. self.assertRaises(isc.cc.data.DataNotFoundError, find_spec_part, config_spec, "no_such_item/multilevel")
  161. self.assertRaises(isc.cc.data.DataNotFoundError, find_spec_part, config_spec, "item6/multilevel")
  162. self.assertRaises(isc.cc.data.DataNotFoundError, find_spec_part, 1, "item6/multilevel")
  163. spec_part = find_spec_part(config_spec, "item6/value1")
  164. self.assertEqual({'item_name': 'value1', 'item_type': 'string', 'item_optional': True, 'item_default': 'default'}, spec_part)
  165. def test_spec_name_list(self):
  166. name_list = spec_name_list(self.cd.get_module_spec().get_config_spec())
  167. self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6'], name_list)
  168. name_list = spec_name_list(self.cd.get_module_spec().get_config_spec(), "", True)
  169. self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6/value1', 'item6/value2'], name_list)
  170. spec_part = find_spec_part(self.cd.get_module_spec().get_config_spec(), "item6")
  171. name_list = spec_name_list(spec_part, "item6", True)
  172. self.assertEqual(['item6/value1', 'item6/value2'], name_list)
  173. spec_part = find_spec_part(self.cd.get_module_spec().get_config_spec(), "item6")
  174. name_list = spec_name_list(spec_part, "item6", True)
  175. self.assertEqual(['item6/value1', 'item6/value2'], name_list)
  176. config_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec22.spec").get_config_spec()
  177. spec_part = find_spec_part(config_spec, "value9")
  178. name_list = spec_name_list(spec_part, "value9", True)
  179. self.assertEqual(['value9/v91', 'value9/v92/v92a', 'value9/v92/v92b'], name_list)
  180. name_list = spec_name_list({ "myModule": config_spec }, "", False)
  181. self.assertEqual(['myModule/'], name_list)
  182. name_list = spec_name_list({ "myModule": config_spec }, "", True)
  183. self.assertEqual(['myModule/', 'myModule/value1', 'myModule/value2', 'myModule/value3', 'myModule/value4', 'myModule/value5', 'myModule/value6/v61', 'myModule/value6/v62', 'myModule/value7', 'myModule/value8', 'myModule/value9/v91', 'myModule/value9/v92/v92a', 'myModule/value9/v92/v92b'], name_list)
  184. self.assertRaises(ConfigDataError, spec_name_list, 1)
  185. self.assertRaises(ConfigDataError, spec_name_list, [ 'a' ])
  186. def test_init(self):
  187. self.assertRaises(ConfigDataError, ConfigData, "asdf")
  188. def test_get_value(self):
  189. value, default = self.cd.get_value("item1")
  190. self.assertEqual(1, value)
  191. self.assertEqual(True, default)
  192. value, default = self.cd.get_value("item2")
  193. self.assertEqual(1.1, value)
  194. self.assertEqual(True, default)
  195. value, default = self.cd.get_value("item3")
  196. self.assertEqual(True, value)
  197. self.assertEqual(True, default)
  198. value, default = self.cd.get_value("item4")
  199. self.assertEqual("test", value)
  200. self.assertEqual(True, default)
  201. value, default = self.cd.get_value("item5")
  202. self.assertEqual(["a", "b"], value)
  203. self.assertEqual(True, default)
  204. value, default = self.cd.get_value("item6")
  205. self.assertEqual({}, value)
  206. self.assertEqual(True, default)
  207. self.assertRaises(isc.cc.data.DataNotFoundError, self.cd.get_value, "no_such_item")
  208. value, default = self.cd.get_value("item6/value2")
  209. self.assertEqual(None, value)
  210. self.assertEqual(False, default)
  211. def test_set_local_config(self):
  212. self.cd.set_local_config({"item1": 2})
  213. value, default = self.cd.get_value("item1")
  214. self.assertEqual(2, value)
  215. self.assertEqual(False, default)
  216. def test_get_local_config(self):
  217. local_config = self.cd.get_local_config()
  218. self.assertEqual({}, local_config)
  219. my_config = { "item1": 2, "item2": 2.2, "item3": False, "item4": "asdf", "item5": [ "c", "d" ] }
  220. self.cd.set_local_config(my_config)
  221. self.assertEqual(my_config, self.cd.get_local_config())
  222. def test_get_item_list(self):
  223. name_list = self.cd.get_item_list()
  224. self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6'], name_list)
  225. name_list = self.cd.get_item_list("", True)
  226. self.assertEqual(['item1', 'item2', 'item3', 'item4', 'item5', 'item6/value1', 'item6/value2'], name_list)
  227. name_list = self.cd.get_item_list("item6", False)
  228. self.assertEqual(['item6/value1', 'item6/value2'], name_list)
  229. def test_get_full_config(self):
  230. full_config = self.cd.get_full_config()
  231. self.assertEqual({ "item1": 1, "item2": 1.1, "item3": True, "item4": "test", "item5": ['a', 'b'], "item6/value1": 'default', 'item6/value2': None}, full_config)
  232. my_config = { "item1": 2, "item2": 2.2, "item3": False, "item4": "asdf", "item5": [ "c", "d" ] }
  233. self.cd.set_local_config(my_config)
  234. full_config = self.cd.get_full_config()
  235. self.assertEqual({ "item1": 2, "item2": 2.2, "item3": False, "item4": "asdf", "item5": [ "c", "d" ], "item6/value1": 'default', 'item6/value2': None}, full_config)
  236. class TestMultiConfigData(unittest.TestCase):
  237. def setUp(self):
  238. if 'CONFIG_TESTDATA_PATH' in os.environ:
  239. self.data_path = os.environ['CONFIG_TESTDATA_PATH']
  240. else:
  241. self.data_path = "../../../testdata"
  242. self.mcd = MultiConfigData()
  243. def test_init(self):
  244. self.assertEqual({}, self.mcd._specifications)
  245. self.assertEqual({}, self.mcd._current_config)
  246. self.assertEqual({}, self.mcd._local_changes)
  247. def test_set_remove_specification(self):
  248. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec1.spec")
  249. self.assertFalse(self.mcd.have_specification(module_spec.get_module_name()))
  250. self.mcd.set_specification(module_spec)
  251. self.assertTrue(self.mcd.have_specification(module_spec.get_module_name()))
  252. self.assert_(module_spec.get_module_name() in self.mcd._specifications)
  253. self.assertEquals(module_spec, self.mcd._specifications[module_spec.get_module_name()])
  254. self.assertRaises(ConfigDataError, self.mcd.set_specification, "asdf")
  255. self.mcd.remove_specification(module_spec.get_module_name())
  256. self.assertFalse(self.mcd.have_specification(module_spec.get_module_name()))
  257. def test_get_module_spec(self):
  258. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec1.spec")
  259. self.mcd.set_specification(module_spec)
  260. module_spec2 = self.mcd.get_module_spec(module_spec.get_module_name())
  261. self.assertEqual(module_spec, module_spec2)
  262. module_spec3 = self.mcd.get_module_spec("no_such_module")
  263. self.assertEqual(None, module_spec3)
  264. def test_find_spec_part(self):
  265. spec_part = self.mcd.find_spec_part("Spec2/item1")
  266. self.assertEqual(None, spec_part)
  267. spec_part = self.mcd.find_spec_part("/Spec2/item1")
  268. self.assertEqual(None, spec_part)
  269. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  270. self.mcd.set_specification(module_spec)
  271. spec_part = self.mcd.find_spec_part("Spec2/item1")
  272. self.assertEqual({'item_name': 'item1', 'item_type': 'integer', 'item_optional': False, 'item_default': 1, }, spec_part)
  273. def test_get_current_config(self):
  274. cf = { 'module1': { 'item1': 2, 'item2': True } }
  275. self.mcd._set_current_config(cf);
  276. self.assertEqual(cf, self.mcd.get_current_config())
  277. def test_get_local_changes(self):
  278. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  279. self.mcd.set_specification(module_spec)
  280. local_changes = self.mcd.get_local_changes()
  281. self.assertEqual({}, local_changes)
  282. self.mcd.set_value("Spec2/item1", 2)
  283. local_changes = self.mcd.get_local_changes()
  284. self.assertEqual({"Spec2": { "item1": 2}}, local_changes)
  285. def test_clear_local_changes(self):
  286. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  287. self.mcd.set_specification(module_spec)
  288. self.mcd.set_value("Spec2/item1", 2)
  289. self.mcd.clear_local_changes()
  290. local_changes = self.mcd.get_local_changes()
  291. self.assertEqual({}, local_changes)
  292. pass
  293. def test_get_local_value(self):
  294. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  295. self.mcd.set_specification(module_spec)
  296. value = self.mcd.get_local_value("Spec2/item1")
  297. self.assertEqual(None, value)
  298. self.mcd.set_value("Spec2/item1", 2)
  299. value = self.mcd.get_local_value("Spec2/item1")
  300. self.assertEqual(2, value)
  301. def test_get_current_value(self):
  302. value = self.mcd.get_current_value("Spec2/item1")
  303. self.assertEqual(None, value)
  304. self.mcd._current_config = { "Spec2": { "item1": 3 } }
  305. value = self.mcd.get_current_value("Spec2/item1")
  306. self.assertEqual(3, value)
  307. pass
  308. def test_get_default_value(self):
  309. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  310. self.mcd.set_specification(module_spec)
  311. value = self.mcd.get_default_value("Spec2/item1")
  312. self.assertEqual(1, value)
  313. value = self.mcd.get_default_value("/Spec2/item1")
  314. self.assertEqual(1, value)
  315. value = self.mcd.get_default_value("Spec2/item5[0]")
  316. self.assertEqual('a', value)
  317. value = self.mcd.get_default_value("Spec2/item5[5]")
  318. self.assertEqual(None, value)
  319. value = self.mcd.get_default_value("Spec2/item5[0][1]")
  320. self.assertEqual(None, value)
  321. value = self.mcd.get_default_value("Spec2/item6/value1")
  322. self.assertEqual('default', value)
  323. value = self.mcd.get_default_value("Spec2/item6/value2")
  324. self.assertEqual(None, value)
  325. value = self.mcd.get_default_value("Spec2/no_such_item/asdf")
  326. self.assertEqual(None, value)
  327. def test_get_value(self):
  328. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  329. self.mcd.set_specification(module_spec)
  330. self.mcd.set_value("Spec2/item1", 2)
  331. value, status = self.mcd.get_value("Spec2/item1")
  332. self.assertEqual(2, value)
  333. self.assertEqual(MultiConfigData.LOCAL, status)
  334. value, status = self.mcd.get_value("Spec2/item2")
  335. self.assertEqual(1.1, value)
  336. self.assertEqual(MultiConfigData.DEFAULT, status)
  337. self.mcd._current_config = { "Spec2": { "item3": False } }
  338. value, status = self.mcd.get_value("Spec2/item3")
  339. self.assertEqual(False, value)
  340. self.assertEqual(MultiConfigData.CURRENT, status)
  341. value, status = self.mcd.get_value("Spec2/no_such_item")
  342. self.assertEqual(None, value)
  343. self.assertEqual(MultiConfigData.NONE, status)
  344. value, status = self.mcd.get_value("Spec2/item5[0]")
  345. self.assertEqual("a", value)
  346. self.assertEqual(MultiConfigData.DEFAULT, status)
  347. value, status = self.mcd.get_value("Spec2/item5[0]", False)
  348. self.assertEqual(None, value)
  349. self.assertEqual(MultiConfigData.NONE, status)
  350. def test_get_value_maps(self):
  351. maps = self.mcd.get_value_maps()
  352. self.assertEqual([], maps)
  353. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec1.spec")
  354. self.mcd.set_specification(module_spec)
  355. maps = self.mcd.get_value_maps()
  356. self.assertEqual([{'default': False, 'type': 'module', 'name': 'Spec1', 'value': None, 'modified': False}], maps)
  357. maps = self.mcd.get_value_maps('Spec2')
  358. self.assertEqual([], maps)
  359. maps = self.mcd.get_value_maps('Spec1')
  360. self.assertEqual([], maps)
  361. self.mcd.remove_specification("Spec1")
  362. self.mcd.remove_specification("foo")
  363. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  364. self.mcd.set_specification(module_spec)
  365. maps = self.mcd.get_value_maps()
  366. self.assertEqual([{'default': False, 'type': 'module', 'name': 'Spec2', 'value': None, 'modified': False}], maps)
  367. self.mcd._set_current_config({ "Spec2": { "item1": 2 } })
  368. self.mcd.set_value("Spec2/item3", False)
  369. maps = self.mcd.get_value_maps("/Spec2")
  370. self.assertEqual([{'default': False, 'type': 'integer', 'name': 'item1', 'value': 2, 'modified': False},
  371. {'default': True, 'type': 'real', 'name': 'item2', 'value': 1.1, 'modified': False},
  372. {'default': False, 'type': 'boolean', 'name': 'item3', 'value': False, 'modified': True},
  373. {'default': True, 'type': 'string', 'name': 'item4', 'value': 'test', 'modified': False},
  374. {'default': True, 'type': 'list', 'name': 'item5', 'value': ['a', 'b'], 'modified': False},
  375. {'default': True, 'type': 'map', 'name': 'item6', 'value': {}, 'modified': False}], maps)
  376. maps = self.mcd.get_value_maps("Spec2")
  377. self.assertEqual([{'default': False, 'type': 'integer', 'name': 'item1', 'value': 2, 'modified': False},
  378. {'default': True, 'type': 'real', 'name': 'item2', 'value': 1.1, 'modified': False},
  379. {'default': False, 'type': 'boolean', 'name': 'item3', 'value': False, 'modified': True},
  380. {'default': True, 'type': 'string', 'name': 'item4', 'value': 'test', 'modified': False},
  381. {'default': True, 'type': 'list', 'name': 'item5', 'value': ['a', 'b'], 'modified': False},
  382. {'default': True, 'type': 'map', 'name': 'item6', 'value': {}, 'modified': False}], maps)
  383. maps = self.mcd.get_value_maps("/Spec2/item5")
  384. self.assertEqual([{'default': False, 'type': 'string', 'name': 'list_element', 'value': 'a', 'modified': False},
  385. {'default': False, 'type': 'string', 'name': 'list_element', 'value': 'b', 'modified': False}], maps)
  386. maps = self.mcd.get_value_maps("/Spec2/item5[0]")
  387. self.assertEqual([{'default': True, 'modified': False, 'name': 'list_element', 'type': 'string', 'value': 'a'}], maps)
  388. maps = self.mcd.get_value_maps("/Spec2/item1")
  389. self.assertEqual([{'default': False, 'type': 'integer', 'name': 'item1', 'value': 2, 'modified': False}], maps)
  390. maps = self.mcd.get_value_maps("/Spec2/item2")
  391. self.assertEqual([{'default': True, 'type': 'real', 'name': 'item2', 'value': 1.1, 'modified': False}], maps)
  392. maps = self.mcd.get_value_maps("/Spec2/item3")
  393. self.assertEqual([{'default': False, 'type': 'boolean', 'name': 'item3', 'value': False, 'modified': True}], maps)
  394. maps = self.mcd.get_value_maps("/Spec2/item4")
  395. self.assertEqual([{'default': True, 'type': 'string', 'name': 'item4', 'value': 'test', 'modified': False}], maps)
  396. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec24.spec")
  397. self.mcd.set_specification(module_spec)
  398. maps = self.mcd.get_value_maps("/Spec24/item")
  399. self.assertEqual([], maps)
  400. self.mcd._set_current_config({ "Spec24": { "item": [] } })
  401. maps = self.mcd.get_value_maps("/Spec24/item")
  402. self.assertEqual([], maps)
  403. def test_set_value(self):
  404. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  405. self.mcd.set_specification(module_spec)
  406. self.mcd.set_value("Spec2/item1", 2)
  407. self.assertRaises(isc.cc.data.DataTypeError,
  408. self.mcd.set_value, "Spec2/item1", "asdf")
  409. self.assertRaises(isc.cc.data.DataNotFoundError,
  410. self.mcd.set_value, "Spec2/no_such_item", 4)
  411. self.mcd.set_value("Spec2/item5[0]", "c")
  412. value, status = self.mcd.get_value("Spec2/item5[0]")
  413. self.assertEqual(value, "c")
  414. self.assertEqual(MultiConfigData.LOCAL, status)
  415. self.assertRaises(isc.cc.data.DataTypeError, self.mcd.set_value, "Spec2/item5[a]", "asdf")
  416. def test_get_config_item_list(self):
  417. config_items = self.mcd.get_config_item_list()
  418. self.assertEqual([], config_items)
  419. module_spec = isc.config.module_spec_from_file(self.data_path + os.sep + "spec2.spec")
  420. self.mcd.set_specification(module_spec)
  421. config_items = self.mcd.get_config_item_list()
  422. self.assertEqual(['Spec2'], config_items)
  423. config_items = self.mcd.get_config_item_list(None, False)
  424. self.assertEqual(['Spec2'], config_items)
  425. config_items = self.mcd.get_config_item_list(None, True)
  426. self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
  427. config_items = self.mcd.get_config_item_list("Spec2", True)
  428. self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
  429. config_items = self.mcd.get_config_item_list("Spec2")
  430. self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6'], config_items)
  431. config_items = self.mcd.get_config_item_list("/Spec2")
  432. self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6'], config_items)
  433. config_items = self.mcd.get_config_item_list("Spec2", True)
  434. self.assertEqual(['Spec2/item1', 'Spec2/item2', 'Spec2/item3', 'Spec2/item4', 'Spec2/item5', 'Spec2/item6/value1', 'Spec2/item6/value2'], config_items)
  435. if __name__ == '__main__':
  436. unittest.main()