| #!/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. |
| """ |
| from __future__ import print_function |
| |
| 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)) / num_rules[backend]) |
| * 100 |
| ) |
| else: |
| print("%s: %d rules covered" % (backend, len(rules_for_backend))) |
| |
| |
| if __name__ == "__main__": |
| main() |