1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
import operator
import re
import xml.etree.ElementTree as ET
from junit_utils import add_junit_property
def pattern_to_re(pattern):
res = []
for c in pattern:
if c == '*':
res.append('.*')
else:
res.append(re.escape(c))
return f"(?:^{''.join(res)}$)"
class MuteTestCheck:
def __init__(self, fn):
self.regexps = []
with open(fn, 'r') as fp:
for line in fp:
line = line.strip()
pattern = pattern_to_re(line)
try:
self.regexps.append(re.compile(pattern))
except re.error:
print(f"Unable to compile regex {pattern!r}")
raise
def __call__(self, fullname):
for r in self.regexps:
if r.match(fullname):
return True
return False
def mute_target(testcase):
err_text = []
err_msg = None
found = False
for node_name in ('failure', 'error'):
while 1:
err_node = testcase.find(node_name)
if err_node is None:
break
msg = err_node.get('message')
if msg:
if err_msg is None:
err_msg = msg
else:
err_text.append(msg)
if err_node.text:
err_text.append(err_node.text)
found = True
testcase.remove(err_node)
if not found:
return False
skipped = ET.Element("skipped")
if err_msg:
skipped.set('message', err_msg)
if err_text:
skipped.text = '\n'.join(err_text)
testcase.append(skipped)
add_junit_property(testcase, "mute", "automatically muted based on rules")
return True
def remove_failure(node):
while 1:
failure = node.find("failure")
if failure is None:
break
node.remove(failure)
def op_attr(node, attr, op, value):
v = int(node.get(attr, 0))
node.set(attr, str(op(v, value)))
def inc_attr(node, attr, value):
return op_attr(node, attr, operator.add, value)
def dec_attr(node, attr, value):
return op_attr(node, attr, operator.sub, value)
def update_suite_info(root, n_remove_failures=None, n_remove_errors=None, n_skipped=None):
if n_remove_failures:
dec_attr(root, "failures", n_remove_failures)
if n_remove_errors:
dec_attr(root, "errors", n_remove_errors)
if n_skipped:
inc_attr(root, "skipped", n_skipped)
def recalc_suite_info(suite):
tests = failures = skipped = 0
elapsed = 0.0
for case in suite.findall("testcase"):
tests += 1
elapsed += float(case.get("time", 0))
if case.find("skipped"):
skipped += 1
if case.find("failure"):
failures += 1
suite.set("tests", str(tests))
suite.set("failures", str(failures))
suite.set("skipped", str(skipped))
suite.set("time", str(elapsed))
|