| import os |
| import sys |
| import argparse |
| import re |
| |
| class Checks(object): |
| class CheckError(Exception): |
| pass |
| |
| def __init__(self, filename, prefix): |
| self.checks = [] |
| self.lines = [] |
| self.check_no_output = False |
| self.filename = filename |
| self.prefix = prefix |
| def readStdin(self): |
| self.lines = [l.rstrip('\r\n') for l in sys.stdin.readlines()] |
| def readChecks(self): |
| with open(self.filename) as f: |
| for line in f: |
| match = re.search('{}: NO_OUTPUT'.format(self.prefix), line) |
| if match is not None: |
| self.check_no_output = True |
| return |
| match = re.search('{}: num_threads=([0-9]+) (.*)$'.format(self.prefix), line) |
| if match is not None: |
| num_threads = int(match.group(1)) |
| for i in range(num_threads): |
| self.checks.append(match.group(2)) |
| continue |
| def check(self): |
| # If no checks at all, then nothing to do |
| if len(self.checks) == 0 and not self.check_no_output: |
| print('Nothing to check for') |
| return |
| # Check if we are expecting no output |
| if self.check_no_output: |
| if len(self.lines) == 0: |
| return |
| else: |
| raise Checks.CheckError('{}: Output was found when expecting none.'.format(self.prefix)) |
| # Run through each check line and see if it exists in the output |
| # If it does, then delete the line from output and look for the |
| # next check line. |
| # If you don't find the line then raise Checks.CheckError |
| # If there are extra lines of output then raise Checks.CheckError |
| for c in self.checks: |
| found = False |
| index = -1 |
| for idx, line in enumerate(self.lines): |
| if re.search(c, line) is not None: |
| found = True |
| index = idx |
| break |
| if not found: |
| raise Checks.CheckError('{}: Did not find: {}'.format(self.prefix, c)) |
| else: |
| del self.lines[index] |
| if len(self.lines) != 0: |
| raise Checks.CheckError('{}: Extra output: {}'.format(self.prefix, self.lines)) |
| |
| # Setup argument parsing |
| parser = argparse.ArgumentParser(description='''This script checks output of |
| a program against "CHECK" lines in filename''') |
| parser.add_argument('filename', default=None, help='filename to check against') |
| parser.add_argument('-c', '--check-prefix', dest='prefix', |
| default='CHECK', help='check prefix token default: %(default)s') |
| command_args = parser.parse_args() |
| # Do the checking |
| checks = Checks(command_args.filename, command_args.prefix) |
| checks.readStdin() |
| checks.readChecks() |
| checks.check() |