config commit
\"\"\"
""")
+
+@step('query statistics(?: (\S+))? of bind10 module (\S+)(?: with cmdctl port (\d+))?')
+def query_statistics(step, statistics, name, cmdctl_port):
+ """
+ query statistics data via bindctl.
+ Parameters:
+ statistics ('statistics <statistics>', optional) : The queried statistics name.
+ name ('module <name>'): The name of the module (case sensitive!)
+ cmdctl_port ('with cmdctl port <portnr>', optional): cmdctl port to send
+ the command to.
+ """
+ port_str = ' with cmdctl port %s' % cmdctl_port \
+ if cmdctl_port else ''
+ step.given('send bind10%s the command Stats show owner=%s%s'\
+ % (port_str, name,\
+ ' name=%s' % statistics if statistics else ''))
+
+def find_value(dictionary, key):
+ """A helper method. Recursively find a value corresponding to the
+ key of the dictionary and returns it. Returns None if the
+ dictionary is not dict type."""
+ if type(dictionary) is not dict:
+ return
+ if key in dictionary:
+ return dictionary[key]
+ else:
+ for v in dictionary.values():
+ return find_value(v, key)
+
+@step('The counter (\S+)(?: for the zone (\S+))? should be' + \
+ '(?:( greater than| less than))? (\d+)')
+def check_statistics(step, counter, zone, gtlt, number):
+ """
+ check the output of bindctl for statistics of specified counter
+ and zone.
+ Parameters:
+ counter ('counter <counter>'): The counter name of statistics.
+ zone ('zone <zone>', optional): The zone name.
+ gtlt (' greater than'|' less than', optional): greater than
+ <number> or less than <number>.
+ number ('<number>): The expect counter number. <number> is assumed
+ to be an unsigned integer.
+ """
+ output = parse_bindctl_output_as_data_structure()
+ found = None
+ zone_str = ""
+ if zone:
+ found = find_value(find_value(output, zone), counter)
+ zone_str = " for zone %s" % zone
+ else:
+ found = find_value(output, counter)
+ assert found is not None, \
+ 'Not found statistics counter %s%s' % (counter, zone_str)
+ msg = "Got %s, expected%s %s as counter %s%s" % \
+ (found, gtlt, number, counter, zone_str)
+ if gtlt and 'greater' in gtlt:
+ assert int(found) > int(number), msg
+ elif gtlt and 'less' in gtlt:
+ assert int(found) < int(number), msg
+ else:
+ assert int(found) == int(number), msg