aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-07-22 23:57:00 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2015-07-23 22:28:03 +0300
commitfa74ef4c5785453ebdd1aaa1380aa7a632336c5b (patch)
tree6494ce9b4db6ff92ea3a4e3553727d58cfa6e970
parent5148972bfe5f4d2012ec29cf913ec8cf5eafd47e (diff)
downloadmeson-fa74ef4c5785453ebdd1aaa1380aa7a632336c5b.zip
meson-fa74ef4c5785453ebdd1aaa1380aa7a632336c5b.tar.gz
meson-fa74ef4c5785453ebdd1aaa1380aa7a632336c5b.tar.bz2
Added timeout kwarg to tests.
-rw-r--r--backends.py6
-rw-r--r--interpreter.py8
-rw-r--r--manual tests/8 timeout/meson.build8
-rw-r--r--manual tests/8 timeout/sleepprog.c6
-rwxr-xr-xmeson_test.py13
5 files changed, 35 insertions, 6 deletions
diff --git a/backends.py b/backends.py
index 851ed51..1fe98b5 100644
--- a/backends.py
+++ b/backends.py
@@ -20,7 +20,7 @@ from coredata import MesonException
class TestSerialisation:
def __init__(self, name, fname, is_cross, exe_wrapper, is_parallel, cmd_args, env,
- should_fail, valgrind_args):
+ should_fail, valgrind_args, timeout):
self.name = name
self.fname = fname
self.is_cross = is_cross
@@ -30,6 +30,7 @@ class TestSerialisation:
self.env = env
self.should_fail = should_fail
self.valgrind_args = valgrind_args
+ self.timeout = timeout
# This class contains the basic functionality that is needed by all backends.
# Feel free to move stuff in and out of it as you see fit.
@@ -251,7 +252,8 @@ class Backend():
else:
exe_wrapper = None
ts = TestSerialisation(t.get_name(), fname, is_cross, exe_wrapper,
- t.is_parallel, t.cmd_args, t.env, t.should_fail, t.valgrind_args)
+ t.is_parallel, t.cmd_args, t.env, t.should_fail, t.valgrind_args,
+ t.timeout)
arr.append(ts)
pickle.dump(arr, datafile)
diff --git a/interpreter.py b/interpreter.py
index 2349696..ebfca1a 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -475,7 +475,7 @@ class RunTargetHolder(InterpreterObject):
self.held_object = build.RunTarget(name, command, args, subdir)
class Test(InterpreterObject):
- def __init__(self, name, exe, is_parallel, cmd_args, env, should_fail, valgrind_args):
+ def __init__(self, name, exe, is_parallel, cmd_args, env, should_fail, valgrind_args, timeout):
InterpreterObject.__init__(self)
self.name = name
self.exe = exe
@@ -484,6 +484,7 @@ class Test(InterpreterObject):
self.env = env
self.should_fail = should_fail
self.valgrind_args = valgrind_args
+ self.timeout = timeout
def get_exe(self):
return self.exe
@@ -1437,7 +1438,10 @@ class Interpreter():
should_fail = kwargs.get('should_fail', False)
if not isinstance(should_fail, bool):
raise InterpreterException('Keyword argument should_fail must be a boolean.')
- t = Test(args[0], args[1].held_object, par, cmd_args, env, should_fail, valgrind_args)
+ timeout = kwargs.get('timeout', 30)
+ if not isinstance(timeout, int):
+ raise InterpreterException('Timeout must be an integer.')
+ t = Test(args[0], args[1].held_object, par, cmd_args, env, should_fail, valgrind_args, timeout)
self.build.tests.append(t)
mlog.debug('Adding test "', mlog.bold(args[0]), '".', sep='')
diff --git a/manual tests/8 timeout/meson.build b/manual tests/8 timeout/meson.build
new file mode 100644
index 0000000..8ba7d4b
--- /dev/null
+++ b/manual tests/8 timeout/meson.build
@@ -0,0 +1,8 @@
+project('timeout', 'c')
+
+# This creates a test that times out. It is a manual test
+# because currently there is no test suite for test that are expected
+# to fail during unit test phase.
+
+exe = executable('sleepprog', 'sleepprog.c')
+test('timeout', exe, timeout : 1)
diff --git a/manual tests/8 timeout/sleepprog.c b/manual tests/8 timeout/sleepprog.c
new file mode 100644
index 0000000..e371482
--- /dev/null
+++ b/manual tests/8 timeout/sleepprog.c
@@ -0,0 +1,6 @@
+#include<unistd.h>
+
+int main(int argc, char **argv) {
+ sleep(1000);
+ return 0;
+}
diff --git a/meson_test.py b/meson_test.py
index 452ce74..5dedd01 100755
--- a/meson_test.py
+++ b/meson_test.py
@@ -97,12 +97,21 @@ def run_single_test(wrap, test):
child_env.update(test.env)
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
env=child_env)
- (stdo, stde) = p.communicate()
+ timed_out = False
+ try:
+ (stdo, stde) = p.communicate(timeout=test.timeout)
+ except subprocess.TimeoutExpired:
+ timed_out = True
+ p.kill()
+ (stdo, stde) = p.communicate()
endtime = time.time()
duration = endtime - starttime
stdo = stdo.decode()
stde = stde.decode()
- if (not test.should_fail and p.returncode == 0) or \
+ if timed_out:
+ res = 'TIMEOUT'
+ tests_failed = True
+ elif (not test.should_fail and p.returncode == 0) or \
(test.should_fail and p.returncode != 0):
res = 'OK'
else: