68 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
| #!/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()
 |