reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
#!/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()