mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 07:01:23 +00:00
kunit: kunit_parser: make parser more robust
Previously, kunit_parser did not properly handle kunit TAP output that - had any prefixes (generated from different configs e.g. CONFIG_PRINTK_TIME) - had unrelated kernel output mixed in the middle of it, which has shown up when testing with allyesconfig To remove prefixes, the parser looks for the first line that includes TAP output, "TAP version 14". It then determines the length of the string before this sequence, and strips that number of characters off the beginning of the following lines until the last KUnit output line is reached. These fixes have been tested with additional tests in the KUnitParseTest and their associated logs have also been added. Signed-off-by: Heidi Fahim <heidifahim@google.com> Reviewed-by: Brendan Higgins <brendanhiggins@google.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
parent
2c523b344d
commit
afc63da64f
10 changed files with 280 additions and 20 deletions
|
@ -46,19 +46,21 @@ class TestStatus(Enum):
|
|||
TEST_CRASHED = auto()
|
||||
NO_TESTS = auto()
|
||||
|
||||
kunit_start_re = re.compile(r'^TAP version [0-9]+$')
|
||||
kunit_end_re = re.compile('List of all partitions:')
|
||||
kunit_start_re = re.compile(r'TAP version [0-9]+$')
|
||||
kunit_end_re = re.compile('(List of all partitions:|'
|
||||
'Kernel panic - not syncing: VFS:|reboot: System halted)')
|
||||
|
||||
def isolate_kunit_output(kernel_output):
|
||||
started = False
|
||||
for line in kernel_output:
|
||||
if kunit_start_re.match(line):
|
||||
if kunit_start_re.search(line):
|
||||
prefix_len = len(line.split('TAP version')[0])
|
||||
started = True
|
||||
yield line
|
||||
elif kunit_end_re.match(line):
|
||||
yield line[prefix_len:] if prefix_len > 0 else line
|
||||
elif kunit_end_re.search(line):
|
||||
break
|
||||
elif started:
|
||||
yield line
|
||||
yield line[prefix_len:] if prefix_len > 0 else line
|
||||
|
||||
def raw_output(kernel_output):
|
||||
for line in kernel_output:
|
||||
|
@ -108,18 +110,16 @@ OK_NOT_OK_SUBTEST = re.compile(r'^\t(ok|not ok) [0-9]+ - (.*)$')
|
|||
|
||||
OK_NOT_OK_MODULE = re.compile(r'^(ok|not ok) [0-9]+ - (.*)$')
|
||||
|
||||
def parse_ok_not_ok_test_case(lines: List[str],
|
||||
test_case: TestCase,
|
||||
expecting_test_case: bool) -> bool:
|
||||
def parse_ok_not_ok_test_case(lines: List[str], test_case: TestCase) -> bool:
|
||||
save_non_diagnositic(lines, test_case)
|
||||
if not lines:
|
||||
if expecting_test_case:
|
||||
test_case.status = TestStatus.TEST_CRASHED
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
test_case.status = TestStatus.TEST_CRASHED
|
||||
return True
|
||||
line = lines[0]
|
||||
match = OK_NOT_OK_SUBTEST.match(line)
|
||||
while not match and lines:
|
||||
line = lines.pop(0)
|
||||
match = OK_NOT_OK_SUBTEST.match(line)
|
||||
if match:
|
||||
test_case.log.append(lines.pop(0))
|
||||
test_case.name = match.group(2)
|
||||
|
@ -150,12 +150,12 @@ def parse_diagnostic(lines: List[str], test_case: TestCase) -> bool:
|
|||
else:
|
||||
return False
|
||||
|
||||
def parse_test_case(lines: List[str], expecting_test_case: bool) -> TestCase:
|
||||
def parse_test_case(lines: List[str]) -> TestCase:
|
||||
test_case = TestCase()
|
||||
save_non_diagnositic(lines, test_case)
|
||||
while parse_diagnostic(lines, test_case):
|
||||
pass
|
||||
if parse_ok_not_ok_test_case(lines, test_case, expecting_test_case):
|
||||
if parse_ok_not_ok_test_case(lines, test_case):
|
||||
return test_case
|
||||
else:
|
||||
return None
|
||||
|
@ -234,11 +234,11 @@ def parse_test_suite(lines: List[str]) -> TestSuite:
|
|||
expected_test_case_num = parse_subtest_plan(lines)
|
||||
if not expected_test_case_num:
|
||||
return None
|
||||
test_case = parse_test_case(lines, expected_test_case_num > 0)
|
||||
expected_test_case_num -= 1
|
||||
while test_case:
|
||||
while expected_test_case_num > 0:
|
||||
test_case = parse_test_case(lines)
|
||||
if not test_case:
|
||||
break
|
||||
test_suite.cases.append(test_case)
|
||||
test_case = parse_test_case(lines, expected_test_case_num > 0)
|
||||
expected_test_case_num -= 1
|
||||
if parse_ok_not_ok_test_suite(lines, test_suite):
|
||||
test_suite.status = bubble_up_test_case_errors(test_suite)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue