summaryrefslogtreecommitdiff
path: root/mesontest.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2016-12-03 20:54:42 +0200
committerGitHub <noreply@github.com>2016-12-03 20:54:42 +0200
commit57b7a98e029e1fe6db6bc9b583f4206fe56061ee (patch)
tree9f83c9cfb4cdf7286d0bacbfeca80afa1fe1d339 /mesontest.py
parentc1efaafec46ad837a2e9a0d409dd98302b619141 (diff)
parent16bdc044e4c980e871379805350a6ccbcadc942e (diff)
downloadmeson-57b7a98e029e1fe6db6bc9b583f4206fe56061ee.tar.gz
Merge pull request #1128 from thiblahute/mesontest_misc_fixes
mesontest misc fixes
Diffstat (limited to 'mesontest.py')
-rwxr-xr-xmesontest.py81
1 files changed, 57 insertions, 24 deletions
diff --git a/mesontest.py b/mesontest.py
index f7e68118c..849e32d1b 100755
--- a/mesontest.py
+++ b/mesontest.py
@@ -76,6 +76,10 @@ parser.add_argument('--num-processes', default=determine_worker_count(), type=in
help='How many parallel processes to use.')
parser.add_argument('-v', '--verbose', default=False, action='store_true',
help='Do not redirect stdout and stderr')
+parser.add_argument('-t', '--timeout-multiplier', type=float, default=1.0,
+ help='Define a multiplier for test timeout, for example '
+ ' when running tests in particular conditions they might take'
+ ' more time to execute.')
parser.add_argument('args', nargs='*')
class TestRun():
@@ -163,6 +167,7 @@ class TestHarness:
else:
cmd = test.fname
+ failling = False
if cmd is None:
res = 'SKIP'
duration = 0.0
@@ -197,9 +202,12 @@ class TestHarness:
cwd=test.workdir,
preexec_fn=setsid)
timed_out = False
+ timeout = test.timeout * self.options.timeout_multiplier
try:
- (stdo, stde) = p.communicate(timeout=test.timeout)
+ (stdo, stde) = p.communicate(timeout=timeout)
except subprocess.TimeoutExpired:
+ if self.options.verbose:
+ print("%s time out (After %d seconds)" % (test.name, timeout))
timed_out = True
# Python does not provide multiplatform support for
# killing a process and all its children so we need
@@ -216,6 +224,7 @@ class TestHarness:
stde = decode(stde)
if timed_out:
res = 'TIMEOUT'
+ failling = True
if p.returncode == GNU_SKIP_RETURNCODE:
res = 'SKIP'
elif (not test.should_fail and p.returncode == 0) or \
@@ -223,8 +232,14 @@ class TestHarness:
res = 'OK'
else:
res = 'FAIL'
+ failling = True
returncode = p.returncode
- return TestRun(res, returncode, test.should_fail, duration, stdo, stde, cmd, test.env)
+ result = TestRun(res, returncode, test.should_fail, duration, stdo, stde, cmd, test.env)
+
+ if failling:
+ self.failled_tests.append(result)
+
+ return result
def print_stats(self, numlen, tests, name, result, i, logfile, jsonlogfile):
startpad = ' '*(numlen - len('%d' % (i+1)))
@@ -297,27 +312,28 @@ class TestHarness:
logfile.write('Log of Meson test suite run on %s.\n\n' %
datetime.datetime.now().isoformat())
- for i, test in enumerate(filtered_tests):
- if test.suite[0] == '':
- visible_name = test.name
- else:
- if self.options.suite is not None:
- visible_name = self.options.suite + ' / ' + test.name
+ for i in range(self.options.repeat):
+ for i, test in enumerate(filtered_tests):
+ if test.suite[0] == '':
+ visible_name = test.name
else:
- visible_name = test.suite[0] + ' / ' + test.name
-
- if not test.is_parallel:
- self.drain_futures(futures)
- futures = []
- res = self.run_single_test(wrap, test)
- if not self.options.verbose:
- self.print_stats(numlen, filtered_tests, visible_name, res, i,
- logfile, jsonlogfile)
- else:
- f = executor.submit(self.run_single_test, wrap, test)
- if not self.options.verbose:
- futures.append((f, numlen, filtered_tests, visible_name, i,
- logfile, jsonlogfile))
+ if self.options.suite is not None:
+ visible_name = self.options.suite + ' / ' + test.name
+ else:
+ visible_name = test.suite[0] + ' / ' + test.name
+
+ if not test.is_parallel:
+ self.drain_futures(futures)
+ futures = []
+ res = self.run_single_test(wrap, test)
+ if not self.options.verbose:
+ self.print_stats(numlen, filtered_tests, visible_name, res, i,
+ logfile, jsonlogfile)
+ else:
+ f = executor.submit(self.run_single_test, wrap, test)
+ if not self.options.verbose:
+ futures.append((f, numlen, filtered_tests, visible_name, i,
+ logfile, jsonlogfile))
self.drain_futures(futures, logfile, jsonlogfile)
finally:
if jsonlogfile:
@@ -331,8 +347,23 @@ class TestHarness:
def drain_futures(self, futures, logfile, jsonlogfile):
for i in futures:
(result, numlen, tests, name, i, logfile, jsonlogfile) = i
- if not self.options.verbose:
+ if self.options.repeat > 1 and self.failled_tests:
+ result.cancel()
+ elif not self.options.verbose:
self.print_stats(numlen, tests, name, result.result(), i, logfile, jsonlogfile)
+ else:
+ result.result()
+
+ if self.options.repeat > 1 and self.failled_tests:
+ if not self.options.verbose:
+ for res in self.failled_tests:
+ print('Test failed:\n\n-- stdout --\n')
+ print(res.stdo)
+ print('\n-- stderr --\n')
+ print(res.stde)
+ return 1
+
+ return
def run_special(self):
'Tests run by the user, usually something like "under gdb 1000 times".'
@@ -357,9 +388,11 @@ class TestHarness:
for i in range(self.options.repeat):
print('Running: %s %d/%d' % (t.name, i+1, self.options.repeat))
if self.options.gdb:
- wrap = ['gdb', '--quiet', '-ex', 'run', '-ex', 'quit']
+ wrap = ['gdb', '--quiet']
if len(t.cmd_args) > 0:
wrap.append('--args')
+ if self.options.repeat > 1:
+ wrap.append('-ex', 'run', '-ex', 'quit')
res = self.run_single_test(wrap, t)
else: