dns_test.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. # Copyright (C) 2013 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 isc.statistics.dns'''
  16. import unittest
  17. import os
  18. import imp
  19. import isc.config
  20. import counters_test
  21. TEST_ZONE_NAME_STR = "example.com."
  22. TEST_ZONE_CLASS_STR = "IN"
  23. TESTDATA_SRCDIR = os.getenv("TESTDATASRCDIR")
  24. from isc.statistics import dns
  25. class BaseTestCounters(counters_test.BaseTestCounters):
  26. def setUp(self):
  27. imp.reload(dns)
  28. self._statistics_data = {}
  29. self.counters = dns.Counters(self.TEST_SPECFILE_LOCATION)
  30. self._entire_server = self.counters._entire_server
  31. self._perzone_prefix = self.counters._perzone_prefix
  32. def test_perzone_counters(self):
  33. # for per-zone counters
  34. for name in self.counters._zones_item_list:
  35. args = (self._perzone_prefix, TEST_ZONE_CLASS_STR,
  36. TEST_ZONE_NAME_STR, name)
  37. if name.find('last_') == 0 and name.endswith('_duration'):
  38. self.counters.start_timer(*args)
  39. self.counters.stop_timer(*args)
  40. self.assertGreaterEqual(self.counters.get(*args), 0.0)
  41. sec = self.counters.get(*args)
  42. for zone_str in (self._entire_server, TEST_ZONE_NAME_STR):
  43. isc.cc.data.set(self._statistics_data,
  44. '%s/%s/%s/%s' % (args[0], args[1],
  45. zone_str, name), sec)
  46. # twice exec stopper, then second is not changed
  47. self.counters.stop_timer(*args)
  48. self.assertEqual(self.counters.get(*args), sec)
  49. else:
  50. self.counters.inc(*args)
  51. self.assertEqual(self.counters.get(*args), 1)
  52. # checks disable/enable
  53. self.counters.disable()
  54. self.counters.inc(*args)
  55. self.assertEqual(self.counters.get(*args), 1)
  56. self.counters.enable()
  57. self.counters.inc(*args)
  58. self.assertEqual(self.counters.get(*args), 2)
  59. for zone_str in (self._entire_server, TEST_ZONE_NAME_STR):
  60. isc.cc.data.set(self._statistics_data,
  61. '%s/%s/%s/%s' % (args[0], args[1],
  62. zone_str, name), 2)
  63. self.check_get_statistics()
  64. def test_xfrrunning_counters(self):
  65. # for counters of xfer running
  66. _suffix = 'xfr_running'
  67. _xfrrunning_names = \
  68. isc.config.spec_name_list(self.counters._statistics_spec,
  69. "", True)
  70. for name in _xfrrunning_names:
  71. if name.find(_suffix) != 1: continue
  72. args = name.split('/')
  73. self.counters.inc(*args)
  74. self.assertEqual(self.counters.get(*args), 1)
  75. self.counters.dec(*args)
  76. self.assertEqual(self.counters.get(*args), 0)
  77. # checks disable/enable
  78. self.counters.disable()
  79. self.counters.inc(*args)
  80. self.assertEqual(self.counters.get(*args), 0)
  81. self.counters.enable()
  82. self.counters.inc(*args)
  83. self.assertEqual(self.counters.get(*args), 1)
  84. self.counters.disable()
  85. self.counters.dec(*args)
  86. self.assertEqual(self.counters.get(*args), 1)
  87. self.counters.enable()
  88. self.counters.dec(*args)
  89. self.assertEqual(self.counters.get(*args), 0)
  90. self._statistics_data[name] = 0
  91. self.check_get_statistics()
  92. def test_socket_counters(self):
  93. # for ipsocket/unixsocket counters
  94. _prefix = 'socket/'
  95. _socket_names = \
  96. isc.config.spec_name_list(self.counters._statistics_spec,
  97. "", True)
  98. for name in _socket_names:
  99. if name.find(_prefix) != 0: continue
  100. args = name.split('/')
  101. self.counters.inc(*args)
  102. self.assertEqual(self.counters.get(*args), 1)
  103. # checks disable/enable
  104. self.counters.disable()
  105. self.counters.inc(*args)
  106. self.assertEqual(self.counters.get(*args), 1)
  107. self.counters.enable()
  108. self.counters.inc(*args)
  109. self.assertEqual(self.counters.get(*args), 2)
  110. isc.cc.data.set(
  111. self._statistics_data, '/'.join(args), 2)
  112. self.check_get_statistics()
  113. def test_perzone_zero_counters(self):
  114. # setting all counters to zero
  115. for name in self.counters._zones_item_list:
  116. args = (self._perzone_prefix, TEST_ZONE_CLASS_STR,
  117. TEST_ZONE_NAME_STR, name)
  118. if name.find('last_') == 0 and name.endswith('_duration'):
  119. zero = 0.0
  120. else:
  121. zero = 0
  122. # set zero
  123. self.counters._incdec(*args, step=zero)
  124. for zone_str in (self._entire_server, TEST_ZONE_NAME_STR):
  125. isc.cc.data.set(self._statistics_data,
  126. '%s/%s/%s/%s' % (args[0], args[1],
  127. zone_str, name), zero)
  128. self.check_get_statistics()
  129. class TestCounters2(unittest.TestCase, BaseTestCounters):
  130. TEST_SPECFILE_LOCATION = TESTDATA_SRCDIR + os.sep + 'test_spec2.spec'
  131. def setUp(self):
  132. BaseTestCounters.setUp(self)
  133. def tearDown(self):
  134. BaseTestCounters.tearDown(self)
  135. class TestCounters3(unittest.TestCase, BaseTestCounters):
  136. TEST_SPECFILE_LOCATION = TESTDATA_SRCDIR + os.sep + 'test_spec3.spec'
  137. @classmethod
  138. def setUpClass(cls):
  139. imp.reload(dns)
  140. def setUp(self):
  141. BaseTestCounters.setUp(self)
  142. def tearDown(self):
  143. BaseTestCounters.tearDown(self)
  144. class BaseDummyModule():
  145. """A base dummy class"""
  146. TEST_SPECFILE_LOCATION = TESTDATA_SRCDIR + os.sep + 'test_spec2.spec'
  147. def __init__(self):
  148. self.counters = dns.Counters(self.TEST_SPECFILE_LOCATION)
  149. def get_counters(self):
  150. return self.counters.get_statistics()
  151. def clear_counters(self):
  152. self.counters.clear_all()
  153. class DummyNotifyOut(BaseDummyModule):
  154. """A dummy class equivalent to notify.notify_out.NotifyOut"""
  155. def __init__(self):
  156. self.counters = dns.Counters()
  157. def inc_counters(self):
  158. """increments counters"""
  159. self.counters.inc('zones', TEST_ZONE_CLASS_STR,
  160. TEST_ZONE_NAME_STR, 'notifyoutv4')
  161. self.counters.inc('zones', TEST_ZONE_CLASS_STR,
  162. TEST_ZONE_NAME_STR, 'notifyoutv6')
  163. class DummyXfroutSession(BaseDummyModule):
  164. """A dummy class equivalent to XfroutSession in b10-xfrout"""
  165. def inc_counters(self):
  166. """increments counters"""
  167. self.counters.inc('zones', TEST_ZONE_CLASS_STR,
  168. TEST_ZONE_NAME_STR, 'xfrreqdone')
  169. self.counters.inc('zones', TEST_ZONE_CLASS_STR,
  170. TEST_ZONE_NAME_STR, 'xfrrej')
  171. self.counters.inc('axfr_running')
  172. self.counters.inc('ixfr_running')
  173. self.counters.dec('axfr_running')
  174. self.counters.dec('ixfr_running')
  175. class DummyUnixSockServer(BaseDummyModule):
  176. """A dummy class equivalent to UnixSockServer in b10-xfrout"""
  177. def inc_counters(self):
  178. """increments counters"""
  179. self.counters.inc('socket', 'unixdomain', 'open')
  180. self.counters.inc('socket', 'unixdomain', 'close')
  181. class DummyXfroutServer(BaseDummyModule):
  182. """A dummy class equivalent to XfroutServer in b10-xfrout"""
  183. def __init__(self):
  184. super().__init__()
  185. self.xfrout_sess = DummyXfroutSession()
  186. self.unix_socket_server = DummyUnixSockServer()
  187. self.notifier = DummyNotifyOut()
  188. def inc_counters(self):
  189. self.xfrout_sess.inc_counters()
  190. self.unix_socket_server.inc_counters()
  191. self.notifier.inc_counters()
  192. class TestDummyNotifyOut(unittest.TestCase):
  193. """Tests counters are incremented in which the spec file is not
  194. loaded"""
  195. def setUp(self):
  196. imp.reload(dns)
  197. self.notifier = DummyNotifyOut()
  198. self.notifier.inc_counters()
  199. def tearDown(self):
  200. self.notifier.clear_counters()
  201. def test_counters(self):
  202. self.assertEqual(
  203. {'zones': {TEST_ZONE_CLASS_STR: { '_SERVER_':
  204. {'notifyoutv4': 1, 'notifyoutv6': 1},
  205. TEST_ZONE_NAME_STR:
  206. {'notifyoutv4': 1, 'notifyoutv6': 1}}}},
  207. self.notifier.get_counters())
  208. class TestDummyXfroutServer(unittest.TestCase):
  209. """Tests counters are incremented or decremented in which the same
  210. spec file is multiply loaded in each child class"""
  211. def setUp(self):
  212. imp.reload(dns)
  213. self.xfrout_server = DummyXfroutServer()
  214. self.xfrout_server.inc_counters()
  215. def tearDown(self):
  216. self.xfrout_server.clear_counters()
  217. def test_counters(self):
  218. self.assertEqual(
  219. {'axfr_running': 0, 'ixfr_running': 0,
  220. 'socket': {'unixdomain': {'open': 1, 'close': 1}},
  221. 'zones': {TEST_ZONE_CLASS_STR: {
  222. '_SERVER_': {'notifyoutv4': 1,
  223. 'notifyoutv6': 1,
  224. 'xfrrej': 1, 'xfrreqdone': 1},
  225. TEST_ZONE_NAME_STR: {'notifyoutv4': 1,
  226. 'notifyoutv6': 1,
  227. 'xfrrej': 1,
  228. 'xfrreqdone': 1}}}},
  229. self.xfrout_server.get_counters())
  230. if __name__== "__main__":
  231. unittest.main()