[Lldb-commits] [lldb] r224171 - Tests will timeout if they exceed time limit.
Zachary Turner
zturner at google.com
Fri Dec 12 16:13:00 PST 2014
I didn't notice this while it was up for review, but a command line option
to dotest might be better than an environment variable, since it will be
documented when you run dotest.py --help
On Fri, Dec 12, 2014 at 4:09 PM Vince Harron <vharron at google.com> wrote:
> Author: vharron
> Date: Fri Dec 12 18:08:19 2014
> New Revision: 224171
>
> URL: http://llvm.org/viewvc/llvm-project?rev=224171&view=rev
> Log:
> Tests will timeout if they exceed time limit.
>
> Default time limit is 5 minutes.
>
> Override the default timeout of 5 minutes with LLDB_TEST_TIMEOUT.
> LLDB_TEST_TIMEOUT=10m
>
> Override the timeout for individual tests with LLDB_[TESTNAME]_TIMEOUT.
> E.g., LLDB_TESTCONCURRENTEVENTS_TIMEOUT=2m
>
> Set to "0" to run without timeout.
>
> Submitted for Chaoren Lin
>
>
> 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=224171&r1=224170&r2=224171&view=diff
> ============================================================
> ==================
> --- lldb/trunk/test/dosep.py (original)
> +++ lldb/trunk/test/dosep.py Fri Dec 12 18:08:19 2014
> @@ -7,15 +7,50 @@ 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 get_timeout_command():
> + if sys.platform.startswith("win32"):
> + return None
> + try:
> + subprocess.call("timeout")
> + return "timeout"
> + except OSError:
> + pass
> + try:
> + subprocess.call("gtimeout")
> + return "gtimeout"
> + except OSError:
> + pass
> + return None
> +
> +timeout_command = get_timeout_command()
> +
> +default_timeout = os.getenv("LLDB_TEST_TIMEOUT") or "5m"
> +
> +# Status codes for running command with timeout.
> +eTimedOut, ePassed, eFailed = 124, 0, 1
> +
> +def call_with_timeout(command, timeout):
> + """Each test will timeout after 5 minutes by default.
> + Override the default timeout of 5 minutes with LLDB_TEST_TIMEOUT.
> + E.g., LLDB_TEST_TIMEOUT=10m
> + Override the timeout for individual tests with LLDB_[TEST
> NAME]_TIMEOUT.
> + E.g., LLDB_TESTCONCURRENTEVENTS_TIMEOUT=2m
> + Set to "0" to run without timeout."""
> + if timeout_command:
> + return subprocess.call([timeout_command, timeout] + command,
> + stdin=subprocess.PIPE)
> + return (ePassed if subprocess.call(command, stdin=subprocess.PIPE) ==
> 0
> + else eFailed)
>
> 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 +64,23 @@ 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):
> - failed.append(name)
> - else:
> + command = ([sys.executable, "%s/dotest.py" % test_root] +
> + (shlex.split(dotest_options) if dotest_options else
> []) +
> + ["-p", name, root])
> +
> + timeout_name = os.path.basename(os.path.
> splitext(name)[0]).upper()
> +
> + timeout = os.getenv("LLDB_%s_TIMEOUT" % timeout_name) or
> default_timeout
> +
> + exit_status = call_with_timeout(command, timeout)
> +
> + if ePassed == exit_status:
> passed.append(name)
> - return (failed, passed)
> + else:
> + if eTimedOut == exit_status:
> + timed_out.append(name)
> + failed.append(name)
> + return (timed_out, failed, passed)
>
> in_q = None
> out_q = None
> @@ -66,15 +112,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 +155,9 @@ 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)
> + timed_out = set(timed_out)
> num_tests = len(failed) + len(passed)
>
> print "Ran %d tests." % num_tests
> @@ -115,7 +165,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)
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20141213/078bef13/attachment.html>
More information about the lldb-commits
mailing list