74 lines
2.8 KiB
Python
74 lines
2.8 KiB
Python
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()
|