xref: /aosp_15_r20/external/autotest/client/common_lib/log.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li# pylint: disable=missing-docstring
3*9c5db199SXin Li
4*9c5db199SXin Lifrom __future__ import absolute_import
5*9c5db199SXin Lifrom __future__ import division
6*9c5db199SXin Lifrom __future__ import print_function
7*9c5db199SXin Liimport sys, re, traceback
8*9c5db199SXin Li
9*9c5db199SXin Li# these statuses are ordered such that a status earlier in the list will
10*9c5db199SXin Li# override a status later in a list (e.g. ERROR during a test will override
11*9c5db199SXin Li# prior GOOD results, but WARN will not override a FAIL)
12*9c5db199SXin Lijob_statuses = ["TEST_NA", "ABORT", "ERROR", "FAIL", "WARN", "GOOD", "ALERT",
13*9c5db199SXin Li                "RUNNING", "NOSTATUS"]
14*9c5db199SXin Li
15*9c5db199SXin Lidef is_valid_status(status):
16*9c5db199SXin Li    if not re.match(r'(START|INFO|(END )?(' + '|'.join(job_statuses) + '))$',
17*9c5db199SXin Li                    status):
18*9c5db199SXin Li        return False
19*9c5db199SXin Li    else:
20*9c5db199SXin Li        return True
21*9c5db199SXin Li
22*9c5db199SXin Li
23*9c5db199SXin Lidef log_and_ignore_errors(msg):
24*9c5db199SXin Li    """ A decorator for wrapping functions in a 'log exception and ignore'
25*9c5db199SXin Li    try-except block. """
26*9c5db199SXin Li    def decorator(fn):
27*9c5db199SXin Li        def decorated_func(*args, **dargs):
28*9c5db199SXin Li            try:
29*9c5db199SXin Li                fn(*args, **dargs)
30*9c5db199SXin Li            except Exception:
31*9c5db199SXin Li                print(msg, file=sys.stderr)
32*9c5db199SXin Li                traceback.print_exc(file=sys.stderr)
33*9c5db199SXin Li        return decorated_func
34*9c5db199SXin Li    return decorator
35