Skip to content

Commit 764ab9d

Browse files
committed
GR-12578 add timeout support for unittests runnner
1 parent 3108516 commit 764ab9d

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

graalpython/com.oracle.graal.python.test/src/python_unittests.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
import subprocess
4545
from collections import defaultdict
4646
from json import dumps
47-
from multiprocessing import Pool
47+
from multiprocessing import Pool, TimeoutError
4848
from pprint import pformat
4949

5050
import argparse
@@ -136,19 +136,41 @@ def _run_unittest(test_path):
136136
return success, output
137137

138138

139-
def run_unittests(unittests):
139+
TIMEOUT = 60 * 20 # 20 mins per unittest wait time max ...
140+
141+
142+
def run_unittests(unittests, timeout):
140143
assert isinstance(unittests, (list, tuple))
141144
num_unittests = len(unittests)
142145
log("[EXEC] running {} unittests ... ", num_unittests)
146+
log("[EXEC] timeout per unittest: {} seconds", timeout)
143147
results = []
144148

145149
pool = Pool()
146150
for ut in unittests:
147151
results.append(pool.apply_async(_run_unittest, args=(ut, )))
148152
pool.close()
149-
pool.join()
150153

151-
return [res.get()[1] for res in results]
154+
log("[INFO] collect results ... ")
155+
out = []
156+
timed_out = []
157+
for i, res in enumerate(results):
158+
try:
159+
_, output = res.get(timeout)
160+
out.append(output)
161+
log("[PROGRESS] {} / {}, \t\t {}%", i, num_unittests, int((i * 100.0) / num_unittests))
162+
except TimeoutError:
163+
log("[ERR] timeout while getting results for {}, skipping!", unittests[i])
164+
timed_out.append(unittests[i])
165+
166+
log("".join(['-' for i in range(120)]))
167+
for t in timed_out:
168+
log("[TIMEOUT] skipped: {}", t)
169+
log("".join(['-' for i in range(120)]))
170+
171+
pool.terminate()
172+
pool.join()
173+
return out
152174

153175

154176
def get_unittests(base_tests_path, limit=None, sort=True, skip_tests=None):
@@ -628,6 +650,7 @@ def main(prog, args):
628650
parser.add_argument("-v", "--verbose", help="Verbose output.", action="store_true")
629651
parser.add_argument("-l", "--limit", help="Limit the number of unittests to run.", default=None, type=int)
630652
parser.add_argument("-t", "--tests_path", help="Unittests path.", default=PATH_UNITTESTS)
653+
parser.add_argument("-T", "--timeout", help="Timeout per unittest run.", default=TIMEOUT, type=int)
631654
parser.add_argument("-o", "--only_tests", help="Run only these unittests (comma sep values).", default=None)
632655
parser.add_argument("-s", "--skip_tests", help="Run all unittests except (comma sep values)."
633656
"the only_tets option takes precedence", default=None)
@@ -656,7 +679,7 @@ def _fmt(t):
656679
skip_tests = set([_fmt(test) for test in flags.skip_tests.split(",")]) if flags.skip_tests else None
657680
unittests = get_unittests(flags.tests_path, limit=flags.limit, skip_tests=skip_tests)
658681

659-
results = run_unittests(unittests)
682+
results = run_unittests(unittests, flags.timeout)
660683
txt_report_path = file_name(TXT_RESULTS_NAME, current_date)
661684
output = save_as_txt(txt_report_path, results)
662685

0 commit comments

Comments
 (0)