xref: /aosp_15_r20/external/autotest/autotest_lib/tko/status_lib.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Liimport collections, re
2*9c5db199SXin Liimport common
3*9c5db199SXin Lifrom autotest_lib.client.common_lib import log
4*9c5db199SXin Li
5*9c5db199SXin Li
6*9c5db199SXin Listatuses = log.job_statuses
7*9c5db199SXin Li
8*9c5db199SXin Li
9*9c5db199SXin Lidef is_worse_than(lhs, rhs):
10*9c5db199SXin Li    """ Compare two statuses and return a boolean indicating if the LHS status
11*9c5db199SXin Li    is worse than the RHS status."""
12*9c5db199SXin Li    return (statuses.index(lhs) < statuses.index(rhs))
13*9c5db199SXin Li
14*9c5db199SXin Li
15*9c5db199SXin Lidef is_worse_than_or_equal_to(lhs, rhs):
16*9c5db199SXin Li    """ Compare two statuses and return a boolean indicating if the LHS status
17*9c5db199SXin Li    is worse than or equal to the RHS status."""
18*9c5db199SXin Li    if lhs == rhs:
19*9c5db199SXin Li        return True
20*9c5db199SXin Li    return is_worse_than(lhs, rhs)
21*9c5db199SXin Li
22*9c5db199SXin Li
23*9c5db199SXin LiDEFAULT_BLOCKLIST = ('\r\x00',)
24*9c5db199SXin Lidef clean_raw_line(raw_line, blocklist=DEFAULT_BLOCKLIST):
25*9c5db199SXin Li    """Strip blocklisted characters from raw_line."""
26*9c5db199SXin Li    return re.sub('|'.join(blocklist), '', raw_line)
27*9c5db199SXin Li
28*9c5db199SXin Li
29*9c5db199SXin Liclass status_stack(object):
30*9c5db199SXin Li    def __init__(self):
31*9c5db199SXin Li        self.status_stack = [statuses[-1]]
32*9c5db199SXin Li
33*9c5db199SXin Li
34*9c5db199SXin Li    def current_status(self):
35*9c5db199SXin Li        return self.status_stack[-1]
36*9c5db199SXin Li
37*9c5db199SXin Li
38*9c5db199SXin Li    def update(self, new_status):
39*9c5db199SXin Li        if new_status not in statuses:
40*9c5db199SXin Li            return
41*9c5db199SXin Li        if is_worse_than(new_status, self.current_status()):
42*9c5db199SXin Li            self.status_stack[-1] = new_status
43*9c5db199SXin Li
44*9c5db199SXin Li
45*9c5db199SXin Li    def start(self):
46*9c5db199SXin Li        self.status_stack.append(statuses[-1])
47*9c5db199SXin Li
48*9c5db199SXin Li
49*9c5db199SXin Li    def end(self):
50*9c5db199SXin Li        result = self.status_stack.pop()
51*9c5db199SXin Li        if len(self.status_stack) == 0:
52*9c5db199SXin Li            self.status_stack.append(statuses[-1])
53*9c5db199SXin Li        return result
54*9c5db199SXin Li
55*9c5db199SXin Li
56*9c5db199SXin Li    def size(self):
57*9c5db199SXin Li        return len(self.status_stack) - 1
58*9c5db199SXin Li
59*9c5db199SXin Li
60*9c5db199SXin Liclass line_buffer(object):
61*9c5db199SXin Li    def __init__(self):
62*9c5db199SXin Li        self.buffer = collections.deque()
63*9c5db199SXin Li
64*9c5db199SXin Li
65*9c5db199SXin Li    def get(self):
66*9c5db199SXin Li        return self.buffer.pop()
67*9c5db199SXin Li
68*9c5db199SXin Li
69*9c5db199SXin Li    def put(self, line):
70*9c5db199SXin Li        self.buffer.appendleft(line)
71*9c5db199SXin Li
72*9c5db199SXin Li
73*9c5db199SXin Li    def put_multiple(self, lines):
74*9c5db199SXin Li        self.buffer.extendleft(lines)
75*9c5db199SXin Li
76*9c5db199SXin Li
77*9c5db199SXin Li    def put_back(self, line):
78*9c5db199SXin Li        self.buffer.append(line)
79*9c5db199SXin Li
80*9c5db199SXin Li
81*9c5db199SXin Li    def size(self):
82*9c5db199SXin Li        return len(self.buffer)
83