|
|
|
@ -29,7 +29,7 @@ import re
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
# Formatting. Default colors to empty strings.
|
|
|
|
|
BOLD, BLUE, RED, GREY = ("", ""), ("", ""), ("", ""), ("", "")
|
|
|
|
|
BOLD, GREEN, RED, GREY = ("", ""), ("", ""), ("", ""), ("", "")
|
|
|
|
|
try:
|
|
|
|
|
# Make sure python thinks it can write unicode to its stdout
|
|
|
|
|
"\u2713".encode("utf_8").decode(sys.stdout.encoding)
|
|
|
|
@ -41,11 +41,27 @@ except UnicodeDecodeError:
|
|
|
|
|
CROSS = "x "
|
|
|
|
|
CIRCLE = "o "
|
|
|
|
|
|
|
|
|
|
if os.name == 'posix':
|
|
|
|
|
if os.name != 'nt' or sys.getwindowsversion() >= (10, 0, 14393):
|
|
|
|
|
if os.name == 'nt':
|
|
|
|
|
import ctypes
|
|
|
|
|
kernel32 = ctypes.windll.kernel32
|
|
|
|
|
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4
|
|
|
|
|
STD_OUTPUT_HANDLE = -11
|
|
|
|
|
STD_ERROR_HANDLE = -12
|
|
|
|
|
# Enable ascii color control to stdout
|
|
|
|
|
stdout = kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
|
|
|
|
|
stdout_mode = ctypes.c_int32()
|
|
|
|
|
kernel32.GetConsoleMode(stdout, ctypes.byref(stdout_mode))
|
|
|
|
|
kernel32.SetConsoleMode(stdout, stdout_mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
|
|
|
|
|
# Enable ascii color control to stderr
|
|
|
|
|
stderr = kernel32.GetStdHandle(STD_ERROR_HANDLE)
|
|
|
|
|
stderr_mode = ctypes.c_int32()
|
|
|
|
|
kernel32.GetConsoleMode(stderr, ctypes.byref(stderr_mode))
|
|
|
|
|
kernel32.SetConsoleMode(stderr, stderr_mode.value | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
|
|
|
|
|
# primitive formatting on supported
|
|
|
|
|
# terminal via ANSI escape sequences:
|
|
|
|
|
BOLD = ('\033[0m', '\033[1m')
|
|
|
|
|
BLUE = ('\033[0m', '\033[0;34m')
|
|
|
|
|
GREEN = ('\033[0m', '\033[0;32m')
|
|
|
|
|
RED = ('\033[0m', '\033[0;31m')
|
|
|
|
|
GREY = ('\033[0m', '\033[1;30m')
|
|
|
|
|
|
|
|
|
@ -227,6 +243,11 @@ def main():
|
|
|
|
|
|
|
|
|
|
# Create base test directory
|
|
|
|
|
tmpdir = "%s/test_runner_₿_🏃_%s" % (args.tmpdirprefix, datetime.datetime.now().strftime("%Y%m%d_%H%M%S"))
|
|
|
|
|
|
|
|
|
|
# If we fixed the command-line and filename encoding issue on Windows, these two lines could be removed
|
|
|
|
|
if config["environment"]["EXEEXT"] == ".exe":
|
|
|
|
|
tmpdir = "%s/test_runner_%s" % (args.tmpdirprefix, datetime.datetime.now().strftime("%Y%m%d_%H%M%S"))
|
|
|
|
|
|
|
|
|
|
os.makedirs(tmpdir)
|
|
|
|
|
|
|
|
|
|
logging.debug("Temporary test directory at %s" % tmpdir)
|
|
|
|
@ -264,7 +285,7 @@ def main():
|
|
|
|
|
|
|
|
|
|
# Remove the test cases that the user has explicitly asked to exclude.
|
|
|
|
|
if args.exclude:
|
|
|
|
|
exclude_tests = [re.sub("\.py$", "", test) + ".py" for test in args.exclude.split(',')]
|
|
|
|
|
exclude_tests = [re.sub("\.py$", "", test) + (".py" if ".py" not in test else "") for test in args.exclude.split(',')]
|
|
|
|
|
for exclude_test in exclude_tests:
|
|
|
|
|
if exclude_test in test_list:
|
|
|
|
|
test_list.remove(exclude_test)
|
|
|
|
@ -359,7 +380,10 @@ def run_tests(test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=Fal
|
|
|
|
|
print('\n============')
|
|
|
|
|
print('{}Combined log for {}:{}'.format(BOLD[1], testdir, BOLD[0]))
|
|
|
|
|
print('============\n')
|
|
|
|
|
combined_logs, _ = subprocess.Popen([sys.executable, os.path.join(tests_dir, 'combine_logs.py'), '-c', testdir], universal_newlines=True, stdout=subprocess.PIPE).communicate()
|
|
|
|
|
combined_logs_args = [sys.executable, os.path.join(tests_dir, 'combine_logs.py'), testdir]
|
|
|
|
|
if BOLD[0]:
|
|
|
|
|
combined_logs_args += ['--color']
|
|
|
|
|
combined_logs, _ = subprocess.Popen(combined_logs_args, universal_newlines=True, stdout=subprocess.PIPE).communicate()
|
|
|
|
|
print("\n".join(deque(combined_logs.splitlines(), combined_logs_len)))
|
|
|
|
|
|
|
|
|
|
if failfast:
|
|
|
|
@ -498,7 +522,7 @@ class TestResult():
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
if self.status == "Passed":
|
|
|
|
|
color = BLUE
|
|
|
|
|
color = GREEN
|
|
|
|
|
glyph = TICK
|
|
|
|
|
elif self.status == "Failed":
|
|
|
|
|
color = RED
|
|
|
|
|