This gives the dmesg class lists of statuses that will make a test a warn or a fail, it includes a few basic checks, namely i915 errors and that tests have not segfaulted.
Signed-off-by: Dylan Baker <[email protected]> --- framework/dmesg.py | 36 ++++++++++++++++++++++++++++++++---- framework/exectest.py | 22 +++++++++++++++------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/framework/dmesg.py b/framework/dmesg.py index 9a23c14..edbea88 100644 --- a/framework/dmesg.py +++ b/framework/dmesg.py @@ -22,6 +22,7 @@ """ Module implementing classes for reading posix dmesg """ import os +import re import subprocess from threads import synchronized_self @@ -29,8 +30,10 @@ __all__ = ['Dmesg'] # plain text list of statuses to be considered either a warn or a fail, any # statuses not on this list will simply be ignored. -WARN_STATUSES = [] -FAIL_STATUSES = [] +WARN_STATUSES = ['segfault'] +FAIL_STATUSES = ['\[drm:.*\] \*ERROR\*', + '\[drm\] stuck on [a-zA-Z]* ring', + '\[drm\] GPU crash dump saved'] class PosixDmesg(object): @@ -45,6 +48,9 @@ class PosixDmesg(object): only be considered authoratative when running non-concurrently. """ + _warns = [re.compile(r) for r in WARN_STATUSES] + _fails = [re.compile(r) for r in FAIL_STATUSES] + def __init__(self): """ Create a dmesg instance """ self.dmesg = [] @@ -57,10 +63,32 @@ class PosixDmesg(object): @synchronized_self def update_dmesg(self): - """ Call dmesg and look for changes. """ + """ Call dmesg and look for changes + + This class calls a helper that checks dmesg for changes, and then + processes those changes looking for warns and fails according to the + WARN_STATUSES and FAIL_STATUSES variables. + + If there are no warns or fails it will return None. Otherwise it will + return a tuple containing a list of warns and a list of fails + respectively + + """ + def is_error(type, error): + """ Filter statuses that are warns or fails """ + for pattern in type: + if pattern.search(error): + return True + return False + self._call_dmesg() + warns = [s for s in self._new_messages if is_error(self._warns, s)] + fails = [s for s in self._new_messages if is_error(self._fails, s)] - return self._new_messages + if warns or fails: + return (warns, fails) + else: + return None def _call_dmesg(self): """ Call dmesg using subproces.check_output diff --git a/framework/exectest.py b/framework/exectest.py index a6c7719..827840b 100644 --- a/framework/exectest.py +++ b/framework/exectest.py @@ -86,7 +86,7 @@ class ExecTest(Test): else: (out, err, returncode) = \ self.get_command_result(command, fullenv) - dmesg_diff = dmesg.update_dmesg() + dmesg_status = dmesg.update_dmesg() # https://bugzilla.gnome.org/show_bug.cgi?id=680214 is # affecting many developers. If we catch it @@ -121,7 +121,8 @@ class ExecTest(Test): results['result'] = 'skip' else: results['result'] = 'fail' - out = self.interpretResult(out, returncode, results, dmesg_diff) + out = self.interpretResult(out, returncode, results, + dmesg_status) crash_codes = [ # Unix: terminated by a signal @@ -165,7 +166,10 @@ class ExecTest(Test): err, out) results['returncode'] = returncode results['command'] = ' '.join(self.command) - results['dmesg'] = dmesg_diff + if dmesg_status: + results['dmesg'] = {} + results['dmesg']['warns'] = dmesg_status[0] + results['dmesg']['fails'] = dmesg_status[1] self.handleErr(results, err) @@ -227,10 +231,14 @@ class PlainExecTest(ExecTest): outpiglit = map(lambda s: s[7:], filter(lambda s: s.startswith('PIGLIT:'), outlines)) - if dmesg: - outpiglit = map(lambda s: s.replace("'pass'", "'dmesg-warn'"), outpiglit) - outpiglit = map(lambda s: s.replace("'warn'", "'dmesg-warn'"), outpiglit) - outpiglit = map(lambda s: s.replace("'fail'", "'dmesg-fail'"), outpiglit) + try: + if dmesg[1]: + outpiglit = map(lambda s: s.replace("pass", "fail"), outpiglit) + outpiglit = map(lambda s: s.replace("warn", "fail"), outpiglit) + elif dmesg[0]: + outpiglit = map(lambda s: s.replace("pass", "warn"), outpiglit) + except TypeError: + pass if len(outpiglit) > 0: try: -- 1.8.1.5 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
