mirror of
https://github.com/clearlinux/graphene.git
synced 2026-08-23 15:37:33 +00:00
93 lines
3.1 KiB
Python
93 lines
3.1 KiB
Python
#!/usr/bin/python
|
|
|
|
import sys, os, subprocess, re, time
|
|
|
|
class Result:
|
|
def __init__(self, out, log, code):
|
|
self.out = out.split('\n')
|
|
self.log = log.split('\n')
|
|
self.code = code
|
|
|
|
class Regression:
|
|
def __init__(self, loader = None, executable = '', prepare = None, timeout = 0):
|
|
self.loader = loader
|
|
self.executable = executable
|
|
self.prepare = prepare
|
|
self.runs = dict()
|
|
default_timeout = int(os.getenv('TIMEOUT', '1000'))
|
|
if default_timeout > timeout:
|
|
self.timeout = default_timeout
|
|
else:
|
|
self.timeout = timeout
|
|
self.keep_log = (os.getenv('KEEP_LOG', '0') == '1')
|
|
|
|
def add_check(self, name, check, times = 1, args = []):
|
|
combined_args = ' '.join(args)
|
|
if not combined_args in self.runs:
|
|
self.runs[combined_args] = []
|
|
self.runs[combined_args].append((name, check, times))
|
|
|
|
def run_checks(self):
|
|
for combined_args in self.runs:
|
|
needed_times = 1
|
|
for (name, check, times) in self.runs[combined_args]:
|
|
if needed_times < times:
|
|
needed_times = times
|
|
|
|
run_times = 0
|
|
outputs = []
|
|
while run_times < needed_times:
|
|
args = []
|
|
if self.loader:
|
|
args.append(self.loader)
|
|
if self.executable:
|
|
args.append(self.executable)
|
|
if combined_args:
|
|
args += combined_args.split(' ')
|
|
|
|
if self.prepare:
|
|
self.prepare(args)
|
|
|
|
time.sleep(0.1)
|
|
|
|
p = subprocess.Popen(args,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE)
|
|
|
|
sleep_time = 0
|
|
finish = False
|
|
while sleep_time < self.timeout:
|
|
time.sleep(0.001)
|
|
if p.poll() is not None:
|
|
finish = True
|
|
break
|
|
sleep_time += 1
|
|
|
|
if not finish and p.poll() is None:
|
|
p.kill()
|
|
|
|
time.sleep(0.1)
|
|
|
|
out = p.stdout.read()
|
|
log = p.stderr.read()
|
|
|
|
outputs.append(Result(out, log, p.returncode))
|
|
|
|
run_times = run_times + 1
|
|
keep_log = False
|
|
for (name, check, times) in self.runs[combined_args]:
|
|
if run_times == times:
|
|
result = check(outputs)
|
|
if result:
|
|
print '\033[92m[Success]\033[0m', name
|
|
else:
|
|
print '\033[93m[Fail ]\033[0m', name
|
|
keep_log = True
|
|
|
|
if self.keep_log and keep_log:
|
|
sargs = [re.sub(r"\W", '_', a).strip('_') for a in args]
|
|
filename = 'log-' + '_'.join(sargs) + '_' + time.strftime("%Y%m%d_%H%M%S")
|
|
with open(filename, 'w') as f:
|
|
f.write(log + out)
|
|
print 'keep log to %s' % (filename)
|