diff --git a/dist/tools/testrunner/testrunner.py b/dist/tools/testrunner/testrunner.py index b8794c23e2ab92bfc03b9b4a4fc7dae26ec66396..5b2b73e20c401d2fc8385dd4e87b780410b1b40b 100755 --- a/dist/tools/testrunner/testrunner.py +++ b/dist/tools/testrunner/testrunner.py @@ -10,14 +10,20 @@ import signal import sys import subprocess import time -from traceback import print_tb +from traceback import extract_tb, print_tb -from pexpect import spawnu, TIMEOUT +import pexpect +PEXPECT_PATH = os.path.dirname(pexpect.__file__) +RIOTBASE = os.environ['RIOTBASE'] or \ + os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..")) + +def list_until(l, cond): + return l[:([i for i, e in enumerate(l) if cond(e)][0])] def run(testfunc, timeout=10, echo=True, traceback=False): env = os.environ.copy() - child = spawnu("make term", env=env, timeout=timeout) + child = pexpect.spawnu("make term", env=env, timeout=timeout) # on many platforms, the termprog needs a short while to be ready... time.sleep(3) @@ -33,8 +39,14 @@ def run(testfunc, timeout=10, echo=True, traceback=False): pass try: testfunc(child) - except TIMEOUT: - print("Timeout in expect script") + except pexpect.TIMEOUT: + timeouted_at = list_until(extract_tb(sys.exc_info()[2]), + lambda frame: + frame.filename.startswith(PEXPECT_PATH))[-1] + print("Timeout in expect script at \"%s\" (%s:%d)" % + (timeouted_at.line, + os.path.relpath(os.path.abspath(timeouted_at.filename), RIOTBASE), + timeouted_at.lineno)) if traceback: print_tb(sys.exc_info()[2]) return 1