| #!/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() |