zonemgr_test.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  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. '''Tests for the ZonemgrRefresh and Zonemgr classes '''
  16. import unittest
  17. import os
  18. import tempfile
  19. from zonemgr import *
  20. ZONE_NAME_CLASS1_IN = ("sd.cn.", "IN")
  21. ZONE_NAME_CLASS2_CH = ("tw.cn", "CH")
  22. ZONE_NAME_CLASS3_IN = ("example.com", "IN")
  23. ZONE_NAME_CLASS1_CH = ("sd.cn.", "CH")
  24. ZONE_NAME_CLASS2_IN = ("tw.cn", "IN")
  25. class ZonemgrTestException(Exception):
  26. pass
  27. class MySession():
  28. def __init__(self):
  29. pass
  30. def group_sendmsg(self, msg, module_name):
  31. if module_name not in ("Auth", "Xfrin"):
  32. raise ZonemgrTestException("module name not exist")
  33. class MyZonemgrRefresh(ZonemgrRefresh):
  34. def __init__(self):
  35. self._cc = MySession()
  36. self._db_file = "initdb.file"
  37. self._zonemgr_refresh_info = {
  38. ('sd.cn.', 'IN'): {
  39. 'last_refresh_time': 1280474398.822142,
  40. 'next_refresh_time': 1280481598.822153,
  41. 'zone_soa_rdata': 'a.dns.cn. root.cnnic.cn. 2009073105 7200 3600 2419200 21600',
  42. 'zone_state': 0},
  43. ('tw.cn', 'CH'): {
  44. 'last_refresh_time': 1280474399.116421,
  45. 'next_refresh_time': 1280481599.116433,
  46. 'zone_soa_rdata': 'a.dns.cn. root.cnnic.cn. 2009073112 7200 3600 2419200 21600',
  47. 'zone_state': 0}
  48. }
  49. class TestZonemgrRefresh(unittest.TestCase):
  50. def setUp(self):
  51. self.stdout_backup = sys.stdout
  52. sys.stdout = open(os.devnull, 'w')
  53. self.zone_refresh = MyZonemgrRefresh()
  54. def test_random_jitter(self):
  55. max = 100025.120
  56. jitter = 0
  57. self.assertEqual(max, self.zone_refresh._random_jitter(max, jitter))
  58. jitter = max / 4
  59. for i in range (0, 150):
  60. self.assertTrue((3 * max / 4) <= self.zone_refresh._random_jitter(max, jitter))
  61. self.assertTrue(self.zone_refresh._random_jitter(max, jitter) <= max)
  62. i += 1;
  63. def test_get_current_time(self):
  64. pass
  65. def test_set_zone_timer(self):
  66. max = 3600
  67. jitter = 900
  68. time1 = time.time()
  69. self.zone_refresh._set_zone_timer(ZONE_NAME_CLASS1_IN, 3600, 900)
  70. time2 = time.time()
  71. zone_timeout = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  72. self.assertTrue((3600 - 900) <= (zone_timeout - time1))
  73. self.assertTrue((zone_timeout - time2) <= 3600)
  74. def test_set_zone_refresh_timer(self):
  75. time1 = time.time()
  76. self.zone_refresh._set_zone_refresh_timer(ZONE_NAME_CLASS1_IN)
  77. zone_timeout = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  78. time2 = time.time()
  79. self.assertTrue((time1 + 7200 * 3 / 4) <= zone_timeout)
  80. self.assertTrue(zone_timeout <= time2 + 7200)
  81. def test_set_zone_retry_timer(self):
  82. time1 = time.time()
  83. self.zone_refresh._set_zone_retry_timer(ZONE_NAME_CLASS1_IN)
  84. zone_timeout = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  85. time2 = time.time()
  86. self.assertTrue((time1 + 3600 * 3 / 4) <= zone_timeout)
  87. self.assertTrue(zone_timeout <= time2 + 3600)
  88. def test_zone_not_exist(self):
  89. self.assertFalse(self.zone_refresh._zone_not_exist(ZONE_NAME_CLASS1_IN))
  90. self.assertTrue(self.zone_refresh._zone_not_exist(ZONE_NAME_CLASS1_CH))
  91. self.assertFalse(self.zone_refresh._zone_not_exist(ZONE_NAME_CLASS2_CH))
  92. self.assertTrue(self.zone_refresh._zone_not_exist(ZONE_NAME_CLASS2_IN))
  93. self.assertTrue(self.zone_refresh._zone_not_exist(ZONE_NAME_CLASS3_IN))
  94. def test_set_zone_notify_timer(self):
  95. time1 = time.time()
  96. self.zone_refresh._set_zone_notify_timer(ZONE_NAME_CLASS1_IN)
  97. zone_timeout = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  98. time2 = time.time()
  99. self.assertTrue(time1 <= zone_timeout)
  100. self.assertTrue(zone_timeout <= time2)
  101. def test_zone_is_expired(self):
  102. current_time = time.time()
  103. zone_expired_time = 2419200
  104. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["last_refresh_time"] = \
  105. current_time - zone_expired_time - 1
  106. self.assertTrue(self.zone_refresh._zone_is_expired(ZONE_NAME_CLASS1_IN))
  107. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["last_refresh_time"] = \
  108. current_time - zone_expired_time + 1
  109. self.assertFalse(self.zone_refresh._zone_is_expired(ZONE_NAME_CLASS1_IN))
  110. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"] = ZONE_EXPIRED
  111. self.assertTrue(self.zone_refresh._zone_is_expired(ZONE_NAME_CLASS1_IN))
  112. def test_get_zone_soa_rdata(self):
  113. soa_rdata1 = 'a.dns.cn. root.cnnic.cn. 2009073105 7200 3600 2419200 21600'
  114. soa_rdata2 = 'a.dns.cn. root.cnnic.cn. 2009073112 7200 3600 2419200 21600'
  115. self.assertEqual(soa_rdata1, self.zone_refresh._get_zone_soa_rdata(ZONE_NAME_CLASS1_IN))
  116. self.assertRaises(KeyError, self.zone_refresh._get_zone_soa_rdata, ZONE_NAME_CLASS1_CH)
  117. self.assertEqual(soa_rdata2, self.zone_refresh._get_zone_soa_rdata(ZONE_NAME_CLASS2_CH))
  118. self.assertRaises(KeyError, self.zone_refresh._get_zone_soa_rdata, ZONE_NAME_CLASS2_IN)
  119. def test_zonemgr_reload_zone(self):
  120. soa_rdata = 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600'
  121. def get_zone_soa(zone_name, db_file):
  122. return (1, 2, 'sd.cn.', 'cn.sd.', 21600, 'SOA', None,
  123. 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600')
  124. sqlite3_ds.get_zone_soa = get_zone_soa
  125. self.zone_refresh.zonemgr_reload_zone(ZONE_NAME_CLASS1_IN)
  126. self.assertEqual(soa_rdata, self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_soa_rdata"])
  127. def test_get_zone_notifier_master(self):
  128. notify_master = "192.168.1.1"
  129. self.assertEqual(None, self.zone_refresh._get_zone_notifier_master(ZONE_NAME_CLASS1_IN))
  130. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["notify_master"] = notify_master
  131. self.assertEqual(notify_master, self.zone_refresh._get_zone_notifier_master(ZONE_NAME_CLASS1_IN))
  132. def test_set_zone_notifier_master(self):
  133. notify_master = "192.168.1.1"
  134. self.zone_refresh._set_zone_notifier_master(ZONE_NAME_CLASS1_IN, notify_master)
  135. self.assertEqual(self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]\
  136. ["notify_master"], notify_master)
  137. def test_clear_zone_notifier_master(self):
  138. notify_master = "192.168.1.1"
  139. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["notify_master"] = notify_master
  140. self.zone_refresh._clear_zone_notifier_master(ZONE_NAME_CLASS1_IN)
  141. self.assertFalse("notify_master" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  142. self.zone_refresh._clear_zone_notifier_master(ZONE_NAME_CLASS2_CH)
  143. self.assertFalse("notify_master" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS2_CH].keys())
  144. def test_get_zone_state(self):
  145. self.assertEqual(ZONE_OK, self.zone_refresh._get_zone_state(ZONE_NAME_CLASS1_IN))
  146. self.assertEqual(ZONE_OK, self.zone_refresh._get_zone_state(ZONE_NAME_CLASS2_CH))
  147. def test_set_zone_state(self):
  148. self.zone_refresh._set_zone_state(ZONE_NAME_CLASS1_IN, ZONE_REFRESHING)
  149. self.zone_refresh._set_zone_state(ZONE_NAME_CLASS2_CH, ZONE_EXPIRED)
  150. self.assertEqual(ZONE_REFRESHING, \
  151. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"])
  152. self.assertEqual(ZONE_EXPIRED, \
  153. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS2_CH]["zone_state"])
  154. def test_get_zone_refresh_timeout(self):
  155. current_time = time.time()
  156. self.assertFalse("refresh_timeout" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  157. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["refresh_timeout"] = current_time
  158. self.assertEqual(current_time, self.zone_refresh._get_zone_refresh_timeout(ZONE_NAME_CLASS1_IN))
  159. def test_set_zone_refresh_timeout(self):
  160. current_time = time.time()
  161. self.zone_refresh._set_zone_refresh_timeout(ZONE_NAME_CLASS1_IN, current_time)
  162. refresh_time = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["refresh_timeout"]
  163. self.assertEqual(current_time, refresh_time)
  164. def test_get_zone_next_refresh_time(self):
  165. current_time = time.time()
  166. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"] = current_time
  167. self.assertEqual(current_time, self.zone_refresh._get_zone_next_refresh_time(ZONE_NAME_CLASS1_IN))
  168. def test_set_zone_next_refresh_time(self):
  169. current_time = time.time()
  170. self.zone_refresh._set_zone_next_refresh_time(ZONE_NAME_CLASS1_IN, current_time)
  171. next_refresh_time = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  172. self.assertEqual(current_time, next_refresh_time)
  173. def test_get_zone_last_refresh_time(self):
  174. current_time = time.time()
  175. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["last_refresh_time"] = current_time
  176. self.assertEqual(current_time, self.zone_refresh._get_zone_last_refresh_time(ZONE_NAME_CLASS1_IN))
  177. def test_set_zone_last_refresh_time(self):
  178. current_time = time.time()
  179. self.zone_refresh._set_zone_last_refresh_time(ZONE_NAME_CLASS1_IN, current_time)
  180. last_refresh_time = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["last_refresh_time"]
  181. self.assertEqual(current_time, last_refresh_time)
  182. def test_send_command(self):
  183. self.assertRaises(ZonemgrTestException, self.zone_refresh._send_command, "Unknown", "Notify", None)
  184. def test_zone_mgr_is_empty(self):
  185. self.assertFalse(self.zone_refresh._zone_mgr_is_empty())
  186. self.zone_refresh._zonemgr_refresh_info = {}
  187. self.assertTrue(self.zone_refresh._zone_mgr_is_empty())
  188. def test_zonemgr_add_zone(self):
  189. soa_rdata = 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600'
  190. def get_zone_soa(zone_name, db_file):
  191. return (1, 2, 'sd.cn.', 'cn.sd.', 21600, 'SOA', None,
  192. 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600')
  193. sqlite3_ds.get_zone_soa = get_zone_soa
  194. self.zone_refresh._zonemgr_refresh_info = {}
  195. self.zone_refresh.zonemgr_add_zone(ZONE_NAME_CLASS1_IN)
  196. self.assertEqual(1, len(self.zone_refresh._zonemgr_refresh_info))
  197. zone_soa_rdata = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_soa_rdata"]
  198. self.assertEqual(soa_rdata, zone_soa_rdata)
  199. self.assertEqual(ZONE_OK, self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"])
  200. self.assertTrue("last_refresh_time" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  201. self.assertTrue("next_refresh_time" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  202. def get_zone_soa2(zone_name, db_file):
  203. return None
  204. sqlite3_ds.get_zone_soa = get_zone_soa2
  205. self.assertRaises(ZonemgrException, self.zone_refresh.zonemgr_add_zone, \
  206. ZONE_NAME_CLASS1_IN)
  207. def test_build_zonemgr_refresh_info(self):
  208. soa_rdata = 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600'
  209. def get_zones_info(db_file):
  210. return [("sd.cn.", "IN")]
  211. def get_zone_soa(zone_name, db_file):
  212. return (1, 2, 'sd.cn.', 'cn.sd.', 21600, 'SOA', None,
  213. 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600')
  214. sqlite3_ds.get_zones_info = get_zones_info
  215. sqlite3_ds.get_zone_soa = get_zone_soa
  216. self.zone_refresh._zonemgr_refresh_info = {}
  217. self.zone_refresh._build_zonemgr_refresh_info()
  218. self.assertEqual(1, len(self.zone_refresh._zonemgr_refresh_info))
  219. zone_soa_rdata = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_soa_rdata"]
  220. self.assertEqual(soa_rdata, zone_soa_rdata)
  221. self.assertEqual(ZONE_OK, self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"])
  222. self.assertTrue("last_refresh_time" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  223. self.assertTrue("next_refresh_time" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  224. def test_zone_handle_notify(self):
  225. self.zone_refresh.zone_handle_notify(ZONE_NAME_CLASS1_IN,"127.0.0.1")
  226. notify_master = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["notify_master"]
  227. self.assertEqual("127.0.0.1", notify_master)
  228. zone_timeout = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  229. current_time = time.time()
  230. self.assertTrue(zone_timeout <= current_time)
  231. self.assertRaises(ZonemgrException, self.zone_refresh.zone_handle_notify,\
  232. ("org.cn.", "IN"), "127.0.0.1")
  233. self.assertRaises(ZonemgrException, self.zone_refresh.zone_handle_notify,\
  234. ZONE_NAME_CLASS3_IN, "127.0.0.1")
  235. def test_zone_refresh_success(self):
  236. soa_rdata = 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600'
  237. def get_zone_soa(zone_name, db_file):
  238. return (1, 2, 'sd.cn.', 'cn.sd.', 21600, 'SOA', None,
  239. 'a.dns.cn. root.cnnic.cn. 2009073106 1800 900 2419200 21600')
  240. sqlite3_ds.get_zone_soa = get_zone_soa
  241. time1 = time.time()
  242. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"] = ZONE_REFRESHING
  243. self.zone_refresh.zone_refresh_success(ZONE_NAME_CLASS1_IN)
  244. time2 = time.time()
  245. zone_soa_rdata = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_soa_rdata"]
  246. self.assertEqual(soa_rdata, zone_soa_rdata)
  247. next_refresh_time = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  248. self.assertTrue((time1 + 3 * 1800 / 4) <= next_refresh_time)
  249. self.assertTrue(next_refresh_time <= time2 + 1800)
  250. self.assertEqual(ZONE_OK, self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"])
  251. last_refresh_time = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["last_refresh_time"]
  252. self.assertTrue(time1 <= last_refresh_time)
  253. self.assertTrue(last_refresh_time <= time2)
  254. self.assertRaises(ZonemgrException, self.zone_refresh.zone_refresh_success, ("org.cn.", "CH"))
  255. self.assertRaises(ZonemgrException, self.zone_refresh.zone_refresh_success, ZONE_NAME_CLASS3_IN)
  256. def test_zone_refresh_fail(self):
  257. soa_rdata = 'a.dns.cn. root.cnnic.cn. 2009073105 7200 3600 2419200 21600'
  258. time1 = time.time()
  259. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"] = ZONE_REFRESHING
  260. self.zone_refresh.zone_refresh_fail(ZONE_NAME_CLASS1_IN)
  261. time2 = time.time()
  262. zone_soa_rdata = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_soa_rdata"]
  263. self.assertEqual(soa_rdata, zone_soa_rdata)
  264. next_refresh_time = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["next_refresh_time"]
  265. self.assertTrue((time1 + 3 * 3600 / 4) <= next_refresh_time)
  266. self.assertTrue(next_refresh_time <= time2 + 3600)
  267. self.assertEqual(ZONE_OK, self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"])
  268. self.assertRaises(ZonemgrException, self.zone_refresh.zone_refresh_fail, ("org.cn.", "CH"))
  269. self.assertRaises(ZonemgrException, self.zone_refresh.zone_refresh_fail, ZONE_NAME_CLASS3_IN)
  270. def test_find_need_do_refresh_zone(self):
  271. time1 = time.time()
  272. self.zone_refresh._zonemgr_refresh_info = {
  273. ("sd.cn.","IN"):{
  274. 'last_refresh_time': time1,
  275. 'next_refresh_time': time1 + 7200,
  276. 'zone_soa_rdata': 'a.dns.cn. root.cnnic.cn. 2009073105 7200 3600 2419200 21600',
  277. 'zone_state': ZONE_OK},
  278. ("tw.cn","CH"):{
  279. 'last_refresh_time': time1 - 7200,
  280. 'next_refresh_time': time1,
  281. 'refresh_timeout': time1 + MAX_TRANSFER_TIMEOUT,
  282. 'zone_soa_rdata': 'a.dns.cn. root.cnnic.cn. 2009073112 7200 3600 2419200 21600',
  283. 'zone_state': ZONE_REFRESHING}
  284. }
  285. zone_need_refresh = self.zone_refresh._find_need_do_refresh_zone()
  286. self.assertEqual(ZONE_NAME_CLASS1_IN, zone_need_refresh)
  287. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["last_refresh_time"] = time1 - 2419200
  288. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"] = ZONE_EXPIRED
  289. zone_need_refresh = self.zone_refresh._find_need_do_refresh_zone()
  290. self.assertEqual(None, zone_need_refresh)
  291. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"] = ZONE_REFRESHING
  292. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["notify_master"] = "192.168.0.1"
  293. zone_need_refresh = self.zone_refresh._find_need_do_refresh_zone()
  294. self.assertEqual(ZONE_NAME_CLASS1_IN, zone_need_refresh)
  295. self.assertEqual(ZONE_EXPIRED, self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"])
  296. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS2_CH]["refresh_timeout"] = time1
  297. zone_need_refresh = self.zone_refresh._find_need_do_refresh_zone()
  298. self.assertEqual(ZONE_NAME_CLASS2_CH, zone_need_refresh)
  299. def test_do_refresh(self):
  300. time1 = time.time()
  301. self.zone_refresh._zonemgr_refresh_info = {
  302. ("sd.cn.", "IN"):{
  303. 'last_refresh_time': time1 - 7200,
  304. 'next_refresh_time': time1 - 1,
  305. 'zone_soa_rdata': 'a.dns.cn. root.cnnic.cn. 2009073105 7200 3600 2419200 21600',
  306. 'zone_state': ZONE_OK}
  307. }
  308. self.zone_refresh._do_refresh(ZONE_NAME_CLASS1_IN)
  309. time2 = time.time()
  310. zone_state = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"]
  311. self.assertEqual(ZONE_REFRESHING, zone_state)
  312. refresh_timeout = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["refresh_timeout"]
  313. self.assertTrue(time1 + MAX_TRANSFER_TIMEOUT <= refresh_timeout)
  314. self.assertTrue(time2 + MAX_TRANSFER_TIMEOUT >= refresh_timeout)
  315. self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["notify_master"] = "127.0.0.1"
  316. self.zone_refresh._do_refresh(ZONE_NAME_CLASS1_IN)
  317. time2 = time.time()
  318. zone_state = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"]
  319. self.assertEqual(ZONE_REFRESHING, zone_state)
  320. refresh_timeout = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["refresh_timeout"]
  321. self.assertTrue(time1 + MAX_TRANSFER_TIMEOUT <= refresh_timeout)
  322. self.assertTrue(time2 + MAX_TRANSFER_TIMEOUT >= refresh_timeout)
  323. self.assertFalse("notify_master" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  324. def test_run_timer(self):
  325. """This case will run timer in daemon thread.
  326. The zone's next_refresh_time is less than now, so zonemgr will do zone refresh
  327. immediately. The zone's state will become "refreshing".
  328. Then closing the socket ,the timer will stop, and throw a ZonemgrException."""
  329. time1 = time.time()
  330. self.zone_refresh._zonemgr_refresh_info = {
  331. ("sd.cn.", "IN"):{
  332. 'last_refresh_time': time1 - 7200,
  333. 'next_refresh_time': time1 - 1,
  334. 'zone_soa_rdata': 'a.dns.cn. root.cnnic.cn. 2009073105 7200 3600 2419200 21600',
  335. 'zone_state': ZONE_OK}
  336. }
  337. master_socket, slave_socket = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
  338. self.zone_refresh._socket = master_socket
  339. master_socket.close()
  340. self.assertRaises(ZonemgrException, self.zone_refresh.run_timer)
  341. self.zone_refresh._socket = slave_socket
  342. listener = threading.Thread(target = self.zone_refresh.run_timer, args = ())
  343. listener.setDaemon(True)
  344. listener.start()
  345. time.sleep(1)
  346. zone_state = self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN]["zone_state"]
  347. self.assertTrue("refresh_timeout" in self.zone_refresh._zonemgr_refresh_info[ZONE_NAME_CLASS1_IN].keys())
  348. self.assertTrue(zone_state == ZONE_REFRESHING)
  349. def tearDown(self):
  350. sys.stdout = self.stdout_backup
  351. class MyCCSession():
  352. def __init__(self):
  353. pass
  354. def get_remote_config_value(self, module_name, identifier):
  355. if module_name == "Auth" and identifier == "database_file":
  356. return "initdb.file", False
  357. else:
  358. return "unknown", False
  359. class MyZonemgr(Zonemgr):
  360. def __init__(self):
  361. self._db_file = "initdb.file"
  362. self._shutdown_event = threading.Event()
  363. self._cc = MySession()
  364. self._module_cc = MyCCSession()
  365. self._config_data = {"zone_name" : "org.cn", "zone_class" : "CH", "master" : "127.0.0.1"}
  366. def _start_zone_refresh_timer(self):
  367. pass
  368. class TestZonemgr(unittest.TestCase):
  369. def setUp(self):
  370. self.zonemgr = MyZonemgr()
  371. def test_config_handler(self):
  372. config_data1 = {"zone_name" : "sd.cn.", "zone_class" : "CH", "master" : "192.168.1.1"}
  373. self.zonemgr.config_handler(config_data1)
  374. self.assertEqual(config_data1, self.zonemgr._config_data)
  375. config_data2 = {"zone_name" : "sd.cn.", "port" : "53", "master" : "192.168.1.1"}
  376. self.zonemgr.config_handler(config_data2)
  377. self.assertEqual(config_data1, self.zonemgr._config_data)
  378. def test_get_db_file(self):
  379. self.assertEqual("initdb.file", self.zonemgr.get_db_file())
  380. def test_parse_cmd_params(self):
  381. params1 = {"zone_name" : "org.cn", "zone_class" : "CH", "master" : "127.0.0.1"}
  382. answer1 = (("org.cn", "CH"), "127.0.0.1")
  383. self.assertEqual(answer1, self.zonemgr._parse_cmd_params(params1, ZONE_NOTIFY_COMMAND))
  384. params2 = {"zone_name" : "org.cn", "zone_class" : "CH"}
  385. answer2 = ("org.cn", "CH")
  386. self.assertEqual(answer2, self.zonemgr._parse_cmd_params(params2, ZONE_XFRIN_SUCCESS_COMMAND))
  387. self.assertRaises(ZonemgrException, self.zonemgr._parse_cmd_params, params2, ZONE_NOTIFY_COMMAND)
  388. params1 = {"zone_class" : "CH"}
  389. self.assertRaises(ZonemgrException, self.zonemgr._parse_cmd_params, params2, ZONE_NOTIFY_COMMAND)
  390. def tearDown(self):
  391. pass
  392. if __name__== "__main__":
  393. unittest.main()