|  | #!/usr/bin/env python | 
|  | """ | 
|  | Summarize the information in the given coverage files. | 
|  |  | 
|  | Emits the number of rules covered or the percentage of rules covered depending | 
|  | on whether --num-rules has been used to specify the total number of rules. | 
|  | """ | 
|  |  | 
|  | import argparse | 
|  | import struct | 
|  |  | 
|  | class FileFormatError(Exception): | 
|  | pass | 
|  |  | 
|  | def backend_int_pair(s): | 
|  | backend, sep, value = s.partition('=') | 
|  | if (sep is None): | 
|  | raise argparse.ArgumentTypeError("'=' missing, expected name=value") | 
|  | if (not backend): | 
|  | raise argparse.ArgumentTypeError("Expected name=value") | 
|  | if (not value): | 
|  | raise argparse.ArgumentTypeError("Expected name=value") | 
|  | return backend, int(value) | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser(description=__doc__) | 
|  | parser.add_argument('input', nargs='+') | 
|  | parser.add_argument('--num-rules', type=backend_int_pair, action='append', | 
|  | metavar='BACKEND=NUM', | 
|  | help='Specify the number of rules for a backend') | 
|  | args = parser.parse_args() | 
|  |  | 
|  | covered_rules = {} | 
|  |  | 
|  | for input_filename in args.input: | 
|  | with open(input_filename, 'rb') as input_fh: | 
|  | data = input_fh.read() | 
|  | pos = 0 | 
|  | while data: | 
|  | backend, _, data = data.partition('\0') | 
|  | pos += len(backend) | 
|  | pos += 1 | 
|  |  | 
|  | if len(backend) == 0: | 
|  | raise FileFormatError() | 
|  | backend, = struct.unpack("%ds" % len(backend), backend) | 
|  |  | 
|  | while data: | 
|  | if len(data) < 8: | 
|  | raise FileFormatError() | 
|  | rule_id, = struct.unpack("Q", data[:8]) | 
|  | pos += 8 | 
|  | data = data[8:] | 
|  | if rule_id == (2 ** 64) - 1: | 
|  | break | 
|  | covered_rules[backend] = covered_rules.get(backend, {}) | 
|  | covered_rules[backend][rule_id] = covered_rules[backend].get(rule_id, 0) + 1 | 
|  |  | 
|  | num_rules = dict(args.num_rules) | 
|  | for backend, rules_for_backend in covered_rules.items(): | 
|  | if backend in num_rules: | 
|  | print "%s: %3.2f%% of rules covered" % (backend, (float(len(rules_for_backend.keys())) / num_rules[backend]) * 100) | 
|  | else: | 
|  | print "%s: %d rules covered" % (backend, len(rules_for_backend.keys())) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |