diff options
Diffstat (limited to 'meta/lib/oeqa/utils/logparser.py')
-rw-r--r-- | meta/lib/oeqa/utils/logparser.py | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py index f8d1c03630..dddea14fc9 100644 --- a/meta/lib/oeqa/utils/logparser.py +++ b/meta/lib/oeqa/utils/logparser.py | |||
@@ -9,6 +9,7 @@ from . import ftools | |||
9 | class PtestParser(object): | 9 | class PtestParser(object): |
10 | def __init__(self): | 10 | def __init__(self): |
11 | self.results = Result() | 11 | self.results = Result() |
12 | self.sections = {} | ||
12 | 13 | ||
13 | def parse(self, logfile): | 14 | def parse(self, logfile): |
14 | test_regex = {} | 15 | test_regex = {} |
@@ -19,28 +20,55 @@ class PtestParser(object): | |||
19 | section_regex = {} | 20 | section_regex = {} |
20 | section_regex['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest") | 21 | section_regex['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest") |
21 | section_regex['end'] = re.compile(r"^END: .*/(.+)/ptest") | 22 | section_regex['end'] = re.compile(r"^END: .*/(.+)/ptest") |
23 | section_regex['duration'] = re.compile(r"^DURATION: (.+)") | ||
24 | section_regex['exitcode'] = re.compile(r"^ERROR: Exit status is (.+)") | ||
25 | section_regex['timeout'] = re.compile(r"^TIMEOUT: .*/(.+)/ptest") | ||
26 | |||
27 | def newsection(): | ||
28 | return { 'name': "No-section", 'log': "" } | ||
29 | |||
30 | current_section = newsection() | ||
22 | 31 | ||
23 | with open(logfile, errors='replace') as f: | 32 | with open(logfile, errors='replace') as f: |
24 | for line in f: | 33 | for line in f: |
25 | result = section_regex['begin'].search(line) | 34 | result = section_regex['begin'].search(line) |
26 | if result: | 35 | if result: |
27 | current_section = result.group(1) | 36 | current_section['name'] = result.group(1) |
28 | continue | 37 | continue |
29 | 38 | ||
30 | result = section_regex['end'].search(line) | 39 | result = section_regex['end'].search(line) |
31 | if result: | 40 | if result: |
32 | if current_section != result.group(1): | 41 | if current_section['name'] != result.group(1): |
33 | bb.warn("Ptest log section mismatch %s vs. %s" % (current_section, result.group(1))) | 42 | bb.warn("Ptest END log section mismatch %s vs. %s" % (current_section['name'], result.group(1))) |
34 | current_section = None | 43 | if current_section['name'] in self.sections: |
44 | bb.warn("Ptest duplicate section for %s" % (current_section['name'])) | ||
45 | self.sections[current_section['name']] = current_section | ||
46 | del self.sections[current_section['name']]['name'] | ||
47 | current_section = newsection() | ||
48 | continue | ||
49 | |||
50 | result = section_regex['timeout'].search(line) | ||
51 | if result: | ||
52 | if current_section['name'] != result.group(1): | ||
53 | bb.warn("Ptest TIMEOUT log section mismatch %s vs. %s" % (current_section['name'], result.group(1))) | ||
54 | current_section['timeout'] = True | ||
35 | continue | 55 | continue |
36 | 56 | ||
57 | for t in ['duration', 'exitcode']: | ||
58 | result = section_regex[t].search(line) | ||
59 | if result: | ||
60 | current_section[t] = result.group(1) | ||
61 | continue | ||
62 | |||
63 | current_section['log'] = current_section['log'] + line | ||
64 | |||
37 | for t in test_regex: | 65 | for t in test_regex: |
38 | result = test_regex[t].search(line) | 66 | result = test_regex[t].search(line) |
39 | if result: | 67 | if result: |
40 | self.results.store(current_section, result.group(1), t) | 68 | self.results.store(current_section['name'], result.group(1), t) |
41 | 69 | ||
42 | self.results.sort_tests() | 70 | self.results.sort_tests() |
43 | return self.results | 71 | return self.results, self.sections |
44 | 72 | ||
45 | class Result(object): | 73 | class Result(object): |
46 | 74 | ||