blob: 9bac2c5d80584d3cc9f08d4fdcc3f301e32328ad [file] [log] [blame]
#!/usr/bin/env python3
import sys
import os
import subprocess
import argparse
import yaml
import time
import re
if __name__ == '__main__':
PYTHON3 = sys.executable
parser = argparse.ArgumentParser(description='Command line options.')
parser.add_argument('--rootdir', dest='rootdir', type=str, required=True,
help="Root directory of Apache Pony Mail")
parser.add_argument('--load', dest='load', type=str, nargs='+',
help="Load only specific yaml spec files instead of all test specs")
parser.add_argument('--yamldir', dest='yamldir', type=str, action='store',
help="Load yaml specs from alternate directory")
parser.add_argument('--nomboxo', dest = 'nomboxo', action='store_true',
help = 'Skip Mboxo processing')
parser.add_argument('--fof', dest='failonfail', action='store_true',
help="Stop running more tests if an error is encountered")
args = parser.parse_args()
yamldir = args.yamldir or "yaml"
if args.load:
spec_files = args.load
else:
spec_files = [os.path.join(yamldir, x) for x in os.listdir(yamldir) if x.endswith('.yaml')]
tests_success = 0
tests_failure = 0
tests_total = 0
sub_success = 0
sub_failure = 0
now = time.time()
failbreak = False
for spec_file in spec_files:
with open(spec_file, 'r') as f:
yml = yaml.safe_load(f)
env = os.environ # always pass parent environ
for test_type in yml:
if test_type == 'args':
# Environment variable override, e.g. MOCK_GMTIME
env_ = yml[test_type].get("env", None)
if env_:
for key, val in env_.items():
env[key] = val
continue
tests_total += 1
print("Running '%s' tests from %s..." % (test_type, spec_file))
try:
if args.nomboxo:
rv = subprocess.check_output(
(PYTHON3, 'tests/test-%s.py' % test_type, '--rootdir', args.rootdir, '--load', spec_file, '--nomboxo'),
env=env)
else:
rv = subprocess.check_output(
(PYTHON3, 'tests/test-%s.py' % test_type, '--rootdir', args.rootdir, '--load', spec_file),
env=env)
tests_success += 1
except subprocess.CalledProcessError as e:
rv = e.output
print("%s test from %s failed with code %d" % (test_type, spec_file, e.returncode))
tests_failure += 1
if args.failonfail:
failbreak = True
break
finally:
# Fetch successes and failures from this spec run, add to total
m = re.search(r"^\[DONE\] (\d+) tests run, (\d+) failed.", rv.decode('ascii'), re.MULTILINE)
if m:
sub_success += int(m.group(1)) - int(m.group(2))
sub_failure += int(m.group(2))
if failbreak:
break
print("-------------------------------------")
print("Done with %u specification%s in %.2f seconds" % (tests_total, 's' if tests_total != 1 else '', time.time() - now))
print("Specs processed: %4u" % tests_total)
print("Total tests run: %4u" % (sub_success+sub_failure))
print("Tests succeeded: %4u" % sub_success)
print("Tests failed: %4u" % sub_failure)
print("-------------------------------------")
if tests_failure:
sys.exit(-1)