2022-08-03 22:37:46 +00:00
#!/usr/bin/env python3
# encoding: utf-8
"""
This script runs a sequence of C++ unit test scenarios.
"""
2024-01-15 23:00:16 +00:00
import argparse, os, subprocess, sys
2022-08-03 22:37:46 +00:00
def get_tests(filename):
test_list = []
for line in open(filename, mode="rt"):
line = line.strip()
if line == "" or line.startswith("#"):
continue
test_list.append(line)
return test_list
def run_with_rerun_for_sdl_video(executable, test_name):
"""A wrapper for subprocess.run with a workaround for the issue on CI of intermittently failing to initialise SDL.
"""
# Sanity check on the number of retries.
# It's a rare failure, a single retry would probably be enough.
sdl_retries = 0
2023-03-11 01:02:39 +00:00
timeout_retries = 0
while sdl_retries < 10 and timeout_retries < 5:
sdl_retry = False
timeout_retry = False
try:
res = subprocess.run([executable, "--run_test="+test_name, "--color_output"], timeout=20, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
except subprocess.TimeoutExpired as t:
timeout_retries += 1
timeout_retry = True
print("Test timed out, attempt", timeout_retries)
else:
if b"Could not initialize SDL_video" in res.stdout:
sdl_retries += 1
sdl_retry = True
print("Could not initialise SDL_video error, attempt", sdl_retries)
if not sdl_retry and not timeout_retry:
2022-08-04 14:13:04 +00:00
return res
2022-08-03 22:37:46 +00:00
if __name__ == '__main__':
ap = argparse.ArgumentParser()
2022-08-04 14:13:04 +00:00
ap.add_argument("-e", "--executable", help="The name of the boost unit test executable. Default is boost_unit_tests.", default="boost_unit_tests")
2023-12-04 15:31:45 +00:00
ap.add_argument("-p", "--path", metavar="dir", help="Path to boost unit test binary. By default assume it is the current directory.", default=".")
2022-08-04 14:13:04 +00:00
ap.add_argument("-l", "--test_list", metavar="filename", help="Loads the list of tests from the given file. Default is boost_test_schedule.", default="boost_test_schedule")
2022-08-03 22:37:46 +00:00
options = ap.parse_args()
2022-08-04 14:13:04 +00:00
tests = get_tests(options.test_list)
2022-08-03 22:37:46 +00:00
executable = options.executable
success=0
failure=0
for test in tests:
2023-03-11 01:02:39 +00:00
res = run_with_rerun_for_sdl_video(os.path.join(options.path, executable), test)
if res.returncode == 0:
success+=1
print("Test "+test+" passed")
2022-08-03 22:37:46 +00:00
else:
2023-03-11 01:02:39 +00:00
failure+=1
print("Test "+test+" failed with return code "+str(res.returncode)+":")
print(res.stdout.decode('utf-8'))
2022-08-03 22:37:46 +00:00
print("Tests passed: "+str(success))
print("Tests failed: "+str(failure))
if failure != 0:
exit(1)