diff options
author | ToshikazuOhiwa <toshikazu_ohiwa@mail.toyota.co.jp> | 2020-03-30 09:24:26 +0900 |
---|---|---|
committer | ToshikazuOhiwa <toshikazu_ohiwa@mail.toyota.co.jp> | 2020-03-30 09:24:26 +0900 |
commit | 5b80bfd7bffd4c20d80b7c70a7130529e9a755dd (patch) | |
tree | b4bb18dcd1487dbf1ea8127e5671b7bb2eded033 /external/poky/meta/lib/oeqa/utils/logparser.py | |
parent | 706ad73eb02caf8532deaf5d38995bd258725cb8 (diff) |
agl-basesystem
Diffstat (limited to 'external/poky/meta/lib/oeqa/utils/logparser.py')
-rw-r--r-- | external/poky/meta/lib/oeqa/utils/logparser.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/external/poky/meta/lib/oeqa/utils/logparser.py b/external/poky/meta/lib/oeqa/utils/logparser.py new file mode 100644 index 00000000..32fde14a --- /dev/null +++ b/external/poky/meta/lib/oeqa/utils/logparser.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +import sys +import os +import re + +# A parser that can be used to identify weather a line is a test result or a section statement. +class PtestParser(object): + def __init__(self): + self.results = {} + self.sections = {} + + def parse(self, logfile): + test_regex = {} + test_regex['PASSED'] = re.compile(r"^PASS:(.+)") + test_regex['FAILED'] = re.compile(r"^FAIL:(.+)") + test_regex['SKIPPED'] = re.compile(r"^SKIP:(.+)") + + section_regex = {} + section_regex['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest") + section_regex['end'] = re.compile(r"^END: .*/(.+)/ptest") + section_regex['duration'] = re.compile(r"^DURATION: (.+)") + section_regex['exitcode'] = re.compile(r"^ERROR: Exit status is (.+)") + section_regex['timeout'] = re.compile(r"^TIMEOUT: .*/(.+)/ptest") + + def newsection(): + return { 'name': "No-section", 'log': "" } + + current_section = newsection() + + with open(logfile, errors='replace') as f: + for line in f: + result = section_regex['begin'].search(line) + if result: + current_section['name'] = result.group(1) + continue + + result = section_regex['end'].search(line) + if result: + if current_section['name'] != result.group(1): + bb.warn("Ptest END log section mismatch %s vs. %s" % (current_section['name'], result.group(1))) + if current_section['name'] in self.sections: + bb.warn("Ptest duplicate section for %s" % (current_section['name'])) + self.sections[current_section['name']] = current_section + del self.sections[current_section['name']]['name'] + current_section = newsection() + continue + + result = section_regex['timeout'].search(line) + if result: + if current_section['name'] != result.group(1): + bb.warn("Ptest TIMEOUT log section mismatch %s vs. %s" % (current_section['name'], result.group(1))) + current_section['timeout'] = True + continue + + for t in ['duration', 'exitcode']: + result = section_regex[t].search(line) + if result: + current_section[t] = result.group(1) + continue + + current_section['log'] = current_section['log'] + line + + for t in test_regex: + result = test_regex[t].search(line) + if result: + if current_section['name'] not in self.results: + self.results[current_section['name']] = {} + self.results[current_section['name']][result.group(1)] = t + + return self.results, self.sections + + # Log the results as files. The file name is the section name and the contents are the tests in that section. + def results_as_files(self, target_dir): + if not os.path.exists(target_dir): + raise Exception("Target directory does not exist: %s" % target_dir) + + for section in self.results: + prefix = 'No-section' + if section: + prefix = section + section_file = os.path.join(target_dir, prefix) + # purge the file contents if it exists + with open(section_file, 'w') as f: + for test_name in sorted(self.results[section]): + status = self.results[section][test_name] + f.write(status + ": " + test_name + "\n") + |