From 392e1f4ddd7eb649e1a71755b9bcf6431739f98f Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Thu, 18 Oct 2018 07:42:20 +0330 Subject: [PATCH] [test/shape-fuzzer] fail on timeout and ubsan errors (#1267) --- test/fuzzing/run-shape-fuzzer-tests.py | 38 ++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/test/fuzzing/run-shape-fuzzer-tests.py b/test/fuzzing/run-shape-fuzzer-tests.py index 074ecc8..8fadd16 100755 --- a/test/fuzzing/run-shape-fuzzer-tests.py +++ b/test/fuzzing/run-shape-fuzzer-tests.py @@ -2,7 +2,36 @@ from __future__ import print_function, division, absolute_import -import sys, os, subprocess +import sys, os, subprocess, tempfile, threading + + +def cmd(command): + # https://stackoverflow.com/a/4408409 + # https://stackoverflow.com/a/10012262 + with tempfile.TemporaryFile() as tempf: + p = subprocess.Popen (command, stderr=tempf) + is_killed = {'value': False} + + def timeout(p, is_killed): + is_killed['value'] = True + p.kill() + timer = threading.Timer (2, timeout, [p, is_killed]) + + try: + timer.start() + p.wait () + tempf.seek (0) + text = tempf.read().decode ("utf-8").strip () + returncode = p.returncode + finally: + timer.cancel() + + if is_killed['value']: + text = 'error: timeout, ' + text + returncode = 1 + + return text, returncode + srcdir = os.environ.get ("srcdir", ".") EXEEXT = os.environ.get ("EXEEXT", "") @@ -24,10 +53,11 @@ parent_path = os.path.join (srcdir, "fonts") for file in os.listdir (parent_path): path = os.path.join(parent_path, file) - p = subprocess.Popen ([hb_shape_fuzzer, path]) + text, returncode = cmd ([hb_shape_fuzzer, path]) + print (text) - if p.wait () != 0: - print ('failure on %s', font) + if returncode != 0 or 'error' in text: + print ('failure on %s' % file) fails = fails + 1 if fails: -- 2.7.4