[Lldb-commits] [lldb] r223423 - Kill any python test script that takes more than 5 minutes
Vince Harron
vharron at google.com
Thu Dec 4 16:23:04 PST 2014
Author: vharron
Date: Thu Dec 4 18:23:03 2014
New Revision: 223423
URL: http://llvm.org/viewvc/llvm-project?rev=223423&view=rev
Log:
Kill any python test script that takes more than 5 minutes
There is at least one test that hangs on the Linux debian buildbot.
When that test hangs, the buildbot kills dosep which loses all test
results. This change kills just the hung test and should let us see
which test is hanging. This is useful for that test and any others
in the future which start hanging.
Modified:
lldb/trunk/test/dosep.py
Modified: lldb/trunk/test/dosep.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/dosep.py?rev=223423&r1=223422&r2=223423&view=diff
==============================================================================
--- lldb/trunk/test/dosep.py (original)
+++ lldb/trunk/test/dosep.py Thu Dec 4 18:23:03 2014
@@ -7,15 +7,29 @@ Run the test suite using a separate proc
import multiprocessing
import os
import platform
+import shlex
+import subprocess
import sys
from optparse import OptionParser
-# Command template of the invocation of the test driver.
-template = '%s %s/dotest.py %s -p %s %s'
+def try_timeout(command):
+ if not sys.platform.startswith("win32"):
+ try:
+ return {0: "passed", 124: "timed out"}.get(
+ subprocess.call(["timeout", "5m"] + command), "failed")
+ except OSError:
+ pass
+ try:
+ return {0: "passed", 124: "timed out"}.get(
+ subprocess.call(["gtimeout", "5m"] + command), "failed")
+ except OSError:
+ pass
+ return "passed" if subprocess.call(command) == 0 else "failed"
def process_dir(root, files, test_root, dotest_options):
"""Examine a directory for tests, and invoke any found within it."""
+ timed_out = []
failed = []
passed = []
for name in files:
@@ -29,12 +43,17 @@ def process_dir(root, files, test_root,
if os.path.islink(path):
continue
- command = template % (sys.executable, test_root, dotest_options if dotest_options else "", name, root)
- if 0 != os.system(command):
+ command = ([sys.executable, "%s/dotest.py" % test_root] +
+ (shlex.split(dotest_options) if dotest_options else []) +
+ ["-p", name, root])
+ exit_status = try_timeout(command)
+ if "passed" != exit_status:
+ if "timed out" == exit_status:
+ timed_out.append(name)
failed.append(name)
else:
passed.append(name)
- return (failed, passed)
+ return (timed_out, failed, passed)
in_q = None
out_q = None
@@ -66,15 +85,17 @@ def walk_and_invoke(test_root, dotest_op
for work_item in test_work_items:
test_results.append(process_dir_worker(work_item))
+ timed_out = []
failed = []
passed = []
for test_result in test_results:
- (dir_failed, dir_passed) = test_result
+ (dir_timed_out, dir_failed, dir_passed) = test_result
+ timed_out += dir_timed_out
failed += dir_failed
passed += dir_passed
- return (failed, passed)
+ return (timed_out, failed, passed)
def main():
test_root = sys.path[0]
@@ -107,7 +128,8 @@ Run lldb test suite using a separate pro
num_threads = 1
system_info = " ".join(platform.uname())
- (failed, passed) = walk_and_invoke(test_root, dotest_options, num_threads)
+ (timed_out, failed, passed) = walk_and_invoke(test_root, dotest_options,
+ num_threads)
num_tests = len(failed) + len(passed)
print "Ran %d tests." % num_tests
@@ -115,7 +137,9 @@ Run lldb test suite using a separate pro
failed.sort()
print "Failing Tests (%d)" % len(failed)
for f in failed:
- print "FAIL: LLDB (suite) :: %s (%s)" % (f, system_info)
+ print "%s: LLDB (suite) :: %s (%s)" % (
+ "TIMEOUT" if f in timed_out else "FAIL", f, system_info
+ )
sys.exit(1)
sys.exit(0)
More information about the lldb-commits
mailing list