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.

(From OE-Core rev: 05991bb5bc8018275d03fdeecee3d5a757840c7c)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie 2019-01-29 13:24:45 +00:00
parent 4ee85b1cd6
commit 88f390bcb6
2 changed files with 30 additions and 56 deletions

View File

@ -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

View File

@ -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.results = Result()
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:(.+)")
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:(.+)")
self.section_regex = {}
self.section_regex['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest")
self.section_regex['end'] = re.compile(r"^END: .*/(.+)/ptest")
section_regex = {}
section_regex['begin'] = re.compile(r"^BEGIN: .*/(.+)/ptest")
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):
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
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)]
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 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
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):