Smail/test/tools/run_review_tests.py

66 lines
2.8 KiB
Python

"""在远程独立目录逐包执行测试,保留全部日志和跳过记录。"""
import argparse
import json
import os
from pathlib import Path
import signal
import subprocess
import time
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--only', action='append', default=[])
parser.add_argument('--run', default='')
args = parser.parse_args()
root = Path(__file__).resolve().parent
assert root.parent == Path('/var/tmp') and root.name.startswith('smail-review-')
assert os.geteuid() != 0, '禁止使用 root 执行测试'
environment = os.environ.copy()
for name in list(environment):
if name.startswith('SMAIL_'):
environment.pop(name)
environment['GOMAXPROCS'] = '1'
environment['GOMEMLIMIT'] = '64MiB'
environment['GOGC'] = '20'
output = root / ('results-' + time.strftime('%Y%m%d-%H%M%S'))
output.mkdir(mode=0o700)
results = []
for item in json.loads((root / 'manifest.json').read_text(encoding='utf-8')):
if args.only and item['directory'] not in args.only:
continue
directory = (root / item['directory']).resolve()
assert directory.is_relative_to(root)
binary = directory / 'review.test'
with binary.open('rb') as stream:
assert stream.read(5) == b'\x7fELF\x02'
started = time.monotonic()
log = output / (item['directory'].replace('/', '-') + '.log')
with log.open('w', encoding='utf-8') as stream:
command = [str(binary), '-test.v', '-test.timeout=180s']
if args.run:
command.append('-test.run=' + args.run)
process = subprocess.Popen(command, cwd=directory, env=environment,
stdout=stream, stderr=subprocess.STDOUT, start_new_session=True)
try:
code = process.wait(timeout=195)
except subprocess.TimeoutExpired:
os.killpg(process.pid, signal.SIGKILL)
process.wait()
code = 124
lines = log.read_text(encoding='utf-8', errors='replace').splitlines()
result = dict(item, code=code, log=str(log), seconds=round(time.monotonic() - started, 2),
passed=sum(line.startswith('--- PASS:') for line in lines),
failed=[line for line in lines if line.lstrip().startswith('--- FAIL:')],
skipped=[line for line in lines if line.lstrip().startswith('--- SKIP:')])
results.append(result)
print(json.dumps(result, ensure_ascii=False), flush=True)
(output / 'results.json').write_text(json.dumps(results, ensure_ascii=False, indent=2), encoding='utf-8')
print('测试记录:' + str(output), flush=True)
return int(any(item['code'] != 0 for item in results))
if __name__ == '__main__':
raise SystemExit(main())