|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import functools
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import unittest
|
|
|
|
from fnmatch import fnmatchcase
|
|
|
|
|
|
|
|
import system_tests
|
|
|
|
|
|
|
|
|
|
|
|
class MyTestLoader(unittest.TestLoader):
|
|
|
|
testNamePatterns = None
|
|
|
|
|
|
|
|
def getTestCaseNames(self, testCaseClass):
|
|
|
|
"""
|
|
|
|
Customize this code to allow you to filter test methods through testNamePatterns.
|
|
|
|
"""
|
|
|
|
def shouldIncludeMethod(attrname):
|
|
|
|
if not attrname.startswith(self.testMethodPrefix):
|
|
|
|
return False
|
|
|
|
testFunc = getattr(testCaseClass, attrname)
|
|
|
|
if not callable(testFunc):
|
|
|
|
return False
|
|
|
|
return self.testNamePatterns is None or \
|
|
|
|
any(fnmatchcase(attrname, pattern) for pattern in self.testNamePatterns)
|
|
|
|
|
|
|
|
testFnNames = list(filter(shouldIncludeMethod, dir(testCaseClass)))
|
|
|
|
if self.sortTestMethodsUsing:
|
|
|
|
testFnNames.sort(key=functools.cmp_to_key(self.sortTestMethodsUsing))
|
|
|
|
return testFnNames
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
parser = argparse.ArgumentParser(description="The system test suite")
|
|
|
|
parser.add_argument(
|
|
|
|
"--config_file",
|
|
|
|
type=str,
|
|
|
|
nargs=1,
|
|
|
|
help="Path to the suite's configuration file",
|
|
|
|
default=['suite.conf']
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
|
|
|
"--verbose", "-v",
|
|
|
|
action='count',
|
|
|
|
help="verbosity level",
|
|
|
|
default=1
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
|
|
|
"--debug",
|
|
|
|
help="enable debugging output",
|
|
|
|
action='store_true'
|
|
|
|
)
|
|
|
|
parser.add_argument(
|
|
|
|
"dir_or_file",
|
|
|
|
help="root directory under which the testsuite searches for tests or a"
|
|
|
|
"single file which tests are run (defaults to the config file's"
|
|
|
|
"location)",
|
|
|
|
default=None,
|
|
|
|
type=str,
|
|
|
|
nargs='?'
|
|
|
|
)
|
|
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
if 'VERBOSE' in os.environ:
|
|
|
|
args.verbose = 2
|
|
|
|
conf_file = args.config_file[0]
|
|
|
|
DEFAULT_ROOT = os.path.abspath(os.path.dirname(conf_file))
|
|
|
|
system_tests.set_debug_mode(args.debug)
|
|
|
|
system_tests.configure_suite(conf_file)
|
|
|
|
|
|
|
|
testLoader = MyTestLoader()
|
|
|
|
testLoader.testMethodPrefix = ''
|
|
|
|
testLoader.testNamePatterns = ['test*', '*test']
|
|
|
|
if args.dir_or_file is None or os.path.isdir(args.dir_or_file):
|
|
|
|
discovered_tests = testLoader.discover(
|
|
|
|
args.dir_or_file or DEFAULT_ROOT
|
|
|
|
)
|
|
|
|
elif os.path.isfile(args.dir_or_file):
|
|
|
|
discovered_tests = testLoader.discover(
|
|
|
|
os.path.dirname(args.dir_or_file),
|
|
|
|
pattern=os.path.split(args.dir_or_file)[1],
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
print(
|
|
|
|
"WARNING: Invalid search location, falling back to {!s}"
|
|
|
|
.format(DEFAULT_ROOT),
|
|
|
|
file=sys.stderr
|
|
|
|
)
|
|
|
|
discovered_tests = testLoader.discover(
|
|
|
|
DEFAULT_ROOT
|
|
|
|
)
|
|
|
|
|
|
|
|
test_res = unittest.runner.TextTestRunner(verbosity=args.verbose)\
|
|
|
|
.run(discovered_tests)
|
|
|
|
|
|
|
|
sys.exit(0 if len(test_res.failures) + len(test_res.errors) == 0 else 1)
|