From 05991bb5bc8018275d03fdeecee3d5a757840c7c Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Tue, 29 Jan 2019 13:24:45 +0000 Subject: oeqa/logparser: Reform the ptest results parser Now we have a dedicated ptest parser, merge in the remaining ptest specific pieces to further clarify and simplify the code, moving to a point where we can consider extending/enhancing it. Signed-off-by: Richard Purdie --- meta/lib/oeqa/runtime/cases/ptest.py | 40 ++----------------------- meta/lib/oeqa/utils/logparser.py | 58 ++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 62 deletions(-) (limited to 'meta/lib') diff --git a/meta/lib/oeqa/runtime/cases/ptest.py b/meta/lib/oeqa/runtime/cases/ptest.py index 1ce22a09e7..ae54a01669 100644 --- a/meta/lib/oeqa/runtime/cases/ptest.py +++ b/meta/lib/oeqa/runtime/cases/ptest.py @@ -1,50 +1,16 @@ import unittest import pprint +import re from oeqa.runtime.case import OERuntimeTestCase from oeqa.core.decorator.depends import OETestDepends from oeqa.core.decorator.oeid import OETestID from oeqa.core.decorator.data import skipIfNotFeature from oeqa.runtime.decorator.package import OEHasPackage -from oeqa.utils.logparser import PtestParser, Result +from oeqa.utils.logparser import PtestParser class PtestRunnerTest(OERuntimeTestCase): - # a ptest log parser - def parse_ptest(self, logfile): - parser = PtestParser() - result = Result() - - with open(logfile, errors='replace') as f: - for line in f: - result_tuple = parser.parse_line(line) - if not result_tuple: - continue - line_type, category, status, name = result_tuple - - if line_type == 'section' and status == 'begin': - current_section = name - continue - - if line_type == 'section' and status == 'end': - current_section = None - continue - - if line_type == 'test' and status == 'pass': - result.store(current_section, name, status) - continue - - if line_type == 'test' and status == 'fail': - result.store(current_section, name, status) - continue - - if line_type == 'test' and status == 'skip': - result.store(current_section, name, status) - continue - - result.sort_tests() - return result - @OETestID(1600) @skipIfNotFeature('ptest', 'Test requires ptest to be in DISTRO_FEATURES') @OETestDepends(['ssh.SSHTest.test_ssh']) @@ -83,7 +49,7 @@ class PtestRunnerTest(OERuntimeTestCase): extras['ptestresult.rawlogs'] = {'log': output} # Parse and save results - parse_result = self.parse_ptest(ptest_runner_log) + parse_result = PtestParser().parse(ptest_runner_log) parse_result.log_as_files(ptest_log_dir, test_status = ['pass','fail', 'skip']) if os.path.exists(ptest_log_dir_link): # Remove the old link to create a new one diff --git a/meta/lib/oeqa/utils/logparser.py b/meta/lib/oeqa/utils/logparser.py index 0807093fda..f8d1c03630 100644 --- a/meta/lib/oeqa/utils/logparser.py +++ b/meta/lib/oeqa/utils/logparser.py @@ -7,32 +7,40 @@ from . import ftools # 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.test_regex = {} - self.test_regex['pass'] = re.compile(r"^PASS:(.+)") - self.test_regex['fail'] = re.compile(r"^FAIL:(.+)") - self.test_regex['skip'] = re.compile(r"^SKIP:(.+)") - - self.section_regex = {} - self.section_regex['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest") - self.section_regex['end'] = re.compile(r"^END: .*/(.+)/ptest") - - # Parse a line and return a tuple containing the type of result (test/section) and its category, status and name - def parse_line(self, line): - - for test_status, status_regex in test_status_list.items(): - test_name = status_regex.search(line) - if test_name: - return ['test', test_category, test_status, test_name.group(1)] - - for section_status, status_regex in section_status_list.items(): - section_name = status_regex.search(line) - if section_name: - return ['section', section_category, section_status, section_name.group(1)] - return None - + self.results = Result() + + def parse(self, logfile): + test_regex = {} + test_regex['pass'] = re.compile(r"^PASS:(.+)") + test_regex['fail'] = re.compile(r"^FAIL:(.+)") + test_regex['skip'] = re.compile(r"^SKIP:(.+)") + + section_regex = {} + section_regex['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest") + section_regex['end'] = re.compile(r"^END: .*/(.+)/ptest") + + with open(logfile, errors='replace') as f: + for line in f: + result = section_regex['begin'].search(line) + if result: + current_section = result.group(1) + continue + + result = section_regex['end'].search(line) + if result: + if current_section != result.group(1): + bb.warn("Ptest log section mismatch %s vs. %s" % (current_section, result.group(1))) + current_section = None + continue + + for t in test_regex: + result = test_regex[t].search(line) + if result: + self.results.store(current_section, result.group(1), t) + + self.results.sort_tests() + return self.results class Result(object): -- cgit 1.2.3-korg