-# Copyright (C) 2010 Internet Systems Consortium.
+# Copyright (C) 2010-2012 Internet Systems Consortium.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
def setUp(self):
self.sock = MySocket(socket.AF_INET,socket.SOCK_STREAM)
+ self.setup_counters()
self.xfrsess = MyXfroutSession(self.sock, None, Dbserver(),
TSIGKeyRing(),
(socket.AF_INET, socket.SOCK_STREAM,
isc.acl.dns.REQUEST_LOADER.load(
[{"action": "ACCEPT"}]),
{},
- counter_xfrrej=self._counter_xfrrej,
- counter_xfrreqdone=self._counter_xfrreqdone)
+ **self._counters)
self.set_request_type(RRType.AXFR()) # test AXFR by default
self.mdata = self.create_request_data()
self.soa_rrset = create_soa(SOA_CURRENT_VERSION)
# some test replaces a module-wide function. We should ensure the
# original is used elsewhere.
self.orig_get_rrset_len = xfrout.get_rrset_len
- self._zone_name_xfrrej = None
- self._zone_name_xfrreqdone = None
- def _counter_xfrrej(self, zone_name):
- self._zone_name_xfrrej = zone_name
-
- def _counter_xfrreqdone(self, zone_name):
- self._zone_name_xfrreqdone = zone_name
+ def setup_counters(self):
+ self._statistics_data = {
+ 'zones' : {
+ TEST_ZONE_NAME_STR : {
+ 'xfrrej': 0,
+ 'xfrreqdone': 0
+ }
+ },
+ 'axfr_started': 0,
+ 'ixfr_started': 0,
+ 'axfr_ended': 0,
+ 'ixfr_ended': 0
+ }
+ def _counter_xfrrej(zone_name):
+ self._statistics_data['zones'][zone_name]['xfrrej'] += 1
+ def _counter_xfrreqdone(zone_name):
+ self._statistics_data['zones'][zone_name]['xfrreqdone'] += 1
+ def _inc_ixfr_running():
+ self._statistics_data['ixfr_started'] += 1
+ def _dec_ixfr_running():
+ self._statistics_data['ixfr_ended'] += 1
+ def _inc_axfr_running():
+ self._statistics_data['axfr_started'] += 1
+ def _dec_axfr_running():
+ self._statistics_data['axfr_ended'] += 1
+ self._counters = {
+ 'counter_xfrrej': _counter_xfrrej,
+ 'counter_xfrreqdone': _counter_xfrreqdone,
+ 'inc_ixfr_running': _inc_ixfr_running,
+ 'dec_ixfr_running': _dec_ixfr_running,
+ 'inc_axfr_running': _inc_axfr_running,
+ 'dec_axfr_running': _dec_axfr_running
+ }
+ self.get_counter = lambda n: \
+ self._statistics_data[n] if 'ixfr_' in n or 'axfr_' in n \
+ else self._statistics_data['zones'][TEST_ZONE_NAME_STR][n]
def tearDown(self):
xfrout.get_rrset_len = self.orig_get_rrset_len
# ACL checks only with the default ACL
def acl_setter(acl):
self.xfrsess._acl = acl
- self.assertIsNone(self._zone_name_xfrrej)
+ self.assertEqual(self.get_counter('xfrrej'), 0)
self.check_transfer_acl(acl_setter)
- self.assertEqual(self._zone_name_xfrrej, TEST_ZONE_NAME_STR)
+ self.assertGreater(self.get_counter('xfrrej'), 0)
def test_transfer_acl_with_nonetype_xfrrej(self):
# ACL checks only with the default ACL and NoneType xfrrej
self.xfrsess._zone_config[zone_key]['transfer_acl'] = acl
self.xfrsess._acl = isc.acl.dns.REQUEST_LOADER.load([
{"from": "127.0.0.1", "action": "DROP"}])
- self.assertIsNone(self._zone_name_xfrrej)
+ self.assertEqual(self.get_counter('xfrrej'), 0)
self.check_transfer_acl(acl_setter)
- self.assertEqual(self._zone_name_xfrrej, TEST_ZONE_NAME_STR)
+ self.assertGreater(self.get_counter('xfrrej'), 0)
def test_transfer_zoneacl_nomatch(self):
# similar to the previous one, but the per zone doesn't match the
isc.acl.dns.REQUEST_LOADER.load([
{"from": "127.0.0.1", "action": "DROP"}])
self.xfrsess._acl = acl
- self.assertIsNone(self._zone_name_xfrrej)
+ self.assertEqual(self.get_counter('xfrrej'), 0)
self.check_transfer_acl(acl_setter)
- self.assertEqual(self._zone_name_xfrrej, TEST_ZONE_NAME_STR)
+ self.assertGreater(self.get_counter('xfrrej'), 0)
def test_get_transfer_acl(self):
# set the default ACL. If there's no specific zone ACL, this one
def myreply(msg, sock):
self.sock.send(b"success")
- self.assertIsNone(self._zone_name_xfrreqdone)
+ self.assertEqual(self.get_counter('xfrreqdone'), 0)
self.xfrsess._reply_xfrout_query = myreply
self.xfrsess.dns_xfrout_start(self.sock, self.mdata)
self.assertEqual(self.sock.readsent(), b"success")
- self.assertEqual(self._zone_name_xfrreqdone, TEST_ZONE_NAME_STR)
+ self.assertGreater(self.get_counter('xfrreqdone'), 0)
def test_dns_xfrout_start_with_nonetype_xfrreqdone(self):
def noerror(msg, name, rrclass):
self.assertTrue(rrsets_equal(expected_rr, actual_rr))
def test_axfr_normal_session(self):
+ self.assertEqual(self.get_counter('axfr_started'), 0)
+ self.assertEqual(self.get_counter('axfr_ended'), 0)
+ self.assertEqual(self.get_counter('ixfr_started'), 0)
+ self.assertEqual(self.get_counter('ixfr_ended'), 0)
XfroutSession._handle(self.xfrsess)
response = self.sock.read_msg(Message.PRESERVE_ORDER);
self.assertEqual(Rcode.NOERROR(), response.get_rcode())
self.check_axfr_stream(response)
+ self.assertEqual(self.xfrsess._request_type, RRType.AXFR())
+ self.assertNotEqual(self.xfrsess._request_type, RRType.IXFR())
+ self.assertEqual(self.get_counter('axfr_started'), 1)
+ self.assertEqual(self.get_counter('axfr_ended'), 1)
+ self.assertEqual(self.get_counter('ixfr_started'), 0)
+ self.assertEqual(self.get_counter('ixfr_ended'), 0)
def test_ixfr_to_axfr(self):
self.xfrsess._request_data = \
# two beginning and trailing SOAs.
self.xfrsess._request_data = \
self.create_request_data(ixfr=IXFR_OK_VERSION)
+ self.assertEqual(self.get_counter('axfr_started'), 0)
+ self.assertEqual(self.get_counter('axfr_ended'), 0)
+ self.assertEqual(self.get_counter('ixfr_started'), 0)
+ self.assertEqual(self.get_counter('ixfr_ended'), 0)
XfroutSession._handle(self.xfrsess)
response = self.sock.read_msg(Message.PRESERVE_ORDER)
actual_records = response.get_section(Message.SECTION_ANSWER)
self.assertEqual(len(expected_records), len(actual_records))
for (expected_rr, actual_rr) in zip(expected_records, actual_records):
self.assertTrue(rrsets_equal(expected_rr, actual_rr))
+ self.assertNotEqual(self.xfrsess._request_type, RRType.AXFR())
+ self.assertEqual(self.xfrsess._request_type, RRType.IXFR())
+ self.assertEqual(self.get_counter('axfr_started'), 0)
+ self.assertEqual(self.get_counter('axfr_ended'), 0)
+ self.assertEqual(self.get_counter('ixfr_started'), 1)
+ self.assertEqual(self.get_counter('ixfr_ended'), 1)
def ixfr_soa_only_common_checks(self, request_serial):
self.xfrsess._request_data = \
class TestXfroutCounter(unittest.TestCase):
def setUp(self):
- statistics_spec = \
- isc.config.module_spec_from_file(\
- xfrout.SPECFILE_LOCATION).get_statistics_spec()
+ self._module_spec = isc.config.module_spec_from_file(\
+ xfrout.SPECFILE_LOCATION)
+ statistics_spec = self._module_spec.get_statistics_spec()
self.xfrout_counter = XfroutCounter(statistics_spec)
self._counters = isc.config.spec_name_list(\
isc.config.find_spec_part(\
self._cycle = 10000 # number of counting per thread
def test_get_default_statistics_data(self):
- self.assertEqual(self.xfrout_counter._get_default_statistics_data(),
- {XfroutCounter.perzone_prefix: {
- XfroutCounter.entire_server: \
- dict([(cnt, 0) for cnt in self._counters])
- }})
-
- def setup_incrementer(self, incrementer):
+ self.assertTrue(\
+ self._module_spec.validate_statistics(\
+ True,
+ self.xfrout_counter._get_default_statistics_data(),
+ )
+ )
+
+ def setup_incrementer(self, incrementer, *args):
self._started.wait()
- for i in range(self._cycle): incrementer(TEST_ZONE_NAME_STR)
+ for i in range(self._cycle): incrementer(*args)
- def start_incrementer(self, incrementer):
+ def start_incrementer(self, incrementer, *args):
threads = []
for i in range(self._number):
threads.append(threading.Thread(\
- target=self.setup_incrementer,\
- args=(incrementer,)\
+ target=self.setup_incrementer, \
+ args=(incrementer,) + args \
))
for th in threads: th.start()
self._started.set()
'%s/%s/%s' % (XfroutCounter.perzone_prefix,\
zone_name, counter_name))
- def test_incrementers(self):
+ def test_xxcrementers(self):
+ # for per-zone counters
result = { XfroutCounter.entire_server: {},
TEST_ZONE_NAME_STR: {} }
for counter_name in self._counters:
- incrementer = getattr(self.xfrout_counter, 'inc_%s' % counter_name)
- self.start_incrementer(incrementer)
- self.assertEqual(self.get_count(\
- TEST_ZONE_NAME_STR, counter_name), \
- self._number * self._cycle)
- self.assertEqual(self.get_count(\
- XfroutCounter.entire_server, counter_name), \
- self._number * self._cycle)
- result[XfroutCounter.entire_server][counter_name] = \
- result[TEST_ZONE_NAME_STR][counter_name] = \
- self._number * self._cycle
+ incrementer = \
+ dict(self.xfrout_counter.get_counters_for_xfroutsession(), \
+ **self.xfrout_counter.get_counters_for_notifyout())\
+ ['counter_%s' % counter_name]
+ self.start_incrementer(incrementer, TEST_ZONE_NAME_STR)
+ self.assertEqual(self.get_count(\
+ TEST_ZONE_NAME_STR, counter_name), \
+ self._number * self._cycle)
+ self.assertEqual(self.get_count(\
+ XfroutCounter.entire_server, counter_name), \
+ self._number * self._cycle)
+ result[XfroutCounter.entire_server][counter_name] = \
+ result[TEST_ZONE_NAME_STR][counter_name] = \
+ self._number * self._cycle
+ statistics_data = {XfroutCounter.perzone_prefix: result}
+
+ # for {a|i}xfrrunning counters
+ for counter_name in self.xfrout_counter._xfrrunning_names:
+ incrementer = \
+ dict(self.xfrout_counter.get_counters_for_xfroutsession(), \
+ **self.xfrout_counter.get_counters_for_notifyout())\
+ ['inc_%s' % counter_name]
+ self.start_incrementer(incrementer)
+ self.assertEqual(
+ self.xfrout_counter.get_statistics()[counter_name],
+ self._number * self._cycle
+ )
+ decrementer = \
+ dict(self.xfrout_counter.get_counters_for_xfroutsession(), \
+ **self.xfrout_counter.get_counters_for_notifyout())\
+ ['dec_%s' % counter_name]
+ self.start_incrementer(decrementer)
+ self.assertEqual(
+ self.xfrout_counter.get_statistics()[counter_name],
+ 0)
+ statistics_data[counter_name] = 0
self.assertEqual(
self.xfrout_counter.get_statistics(),
- {XfroutCounter.perzone_prefix: result})
+ statistics_data)
+ self.assertTrue(\
+ self._module_spec.validate_statistics(\
+ True, statistics_data
+ )
+ )
def test_add_perzone_counter(self):
for counter_name in self._counters: