diff --git a/test/rt-test.py b/test/rt-test.py index 9a90207..dee4b84 100644 --- a/test/rt-test.py +++ b/test/rt-test.py @@ -1,3 +1,6 @@ +import atexit +import queue +import threading import subprocess import signal import re @@ -6,15 +9,21 @@ import datetime import os import importlib.util +msg_queue = queue.Queue(-1) +proc = None + class TestCase: def __init__(self, name, expected): self.name = name self.expected = expected -def test_failure(case, exp, expected_idx, found): - print("FAILURE: %s #%d, expected '%s', found '%s'" %(case.name, expected_idx + 1, exp, found)) +def failure(msg): + print("FAILURE: %s" %(msg)) sys.exit(1) +def test_failure(case, exp, expected_idx, found): + failure("%s #%d, expected '%s', found '%s'" %(case.name, expected_idx + 1, exp, found)) + def test_pass(case, exp, expected_idx, found): print("PASS: %s #%d, expected '%s', found '%s'" %(case.name, expected_idx + 1, exp, found)) @@ -33,6 +42,15 @@ def get_post_archinit_cases(): TestCase("Init finishes", [r"Init done"]) ] +def read_messages(proc): + while True: + line = proc.stdout.readline().decode("utf-8") + msg_queue.put(line) + +def cleanup(): + global proc + os.killpg(os.getpgid(proc.pid), signal.SIGTERM) + if __name__ == "__main__": arch = sys.argv[1] zig_path = sys.argv[2] @@ -46,8 +64,12 @@ if __name__ == "__main__": cases = get_pre_archinit_cases() + arch_module.get_test_cases(TestCase) + get_post_archinit_cases() if len(cases) > 0: - proc = subprocess.Popen(zig_path + " build run -Drt-test=true", stdout=subprocess.PIPE, shell=True) + proc = subprocess.Popen(zig_path + " build run -Drt-test=true", stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid) + atexit.register(cleanup) case_idx = 0 + read_thread = threading.Thread(target=read_messages, args=(proc,)) + read_thread.daemon = True + read_thread.start() # Go through the cases while case_idx < len(cases): case = cases[case_idx] @@ -55,9 +77,10 @@ if __name__ == "__main__": # Go through the expected log messages while expected_idx < len(case.expected): e = r"\[INFO\] " + case.expected[expected_idx] - line = proc.stdout.readline().decode("utf-8") - if not line: - break + try: + line = msg_queue.get(block=True, timeout=5) + except queue.Empty: + failure("Timed out waiting for '%s'" %(e)) line = line.strip() pattern = re.compile(e) # Pass if the line matches the expected pattern, else fail @@ -67,5 +90,4 @@ if __name__ == "__main__": test_failure(case, e, expected_idx, line) expected_idx += 1 case_idx += 1 - proc.kill() sys.exit(0)