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