kunit: tool: delete kunit_parser.TestResult type

The `log` field is unused, and the `status` field is accessible via
`test.status`.

So it's simpler to just return the main `Test` object directly.

And since we're no longer returning a namedtuple, which has no type
annotations, this hopefully means typecheckers are better equipped to
find any errors.

Signed-off-by: Daniel Latypov <dlatypov@google.com>
Reviewed-by: Brendan Higgins <brendanhiggins@google.com>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
This commit is contained in:
Daniel Latypov 2021-12-14 11:26:12 -08:00 committed by Shuah Khan
parent db1679813f
commit e0cc8c052a
4 changed files with 29 additions and 35 deletions

View File

@ -172,7 +172,7 @@ def exec_tests(linux: kunit_kernel.LinuxSourceTree, request: KunitExecRequest) -
test_end = time.time() test_end = time.time()
exec_time += test_end - test_start exec_time += test_end - test_start
test_counts.add_subtest_counts(result.result.test.counts) test_counts.add_subtest_counts(result.result.counts)
if len(filter_globs) == 1 and test_counts.crashed > 0: if len(filter_globs) == 1 and test_counts.crashed > 0:
bd = request.build_dir bd = request.build_dir
@ -181,7 +181,7 @@ def exec_tests(linux: kunit_kernel.LinuxSourceTree, request: KunitExecRequest) -
bd, bd, kunit_kernel.get_outfile_path(bd), bd, sys.argv[0])) bd, bd, kunit_kernel.get_outfile_path(bd), bd, sys.argv[0]))
kunit_status = _map_to_overall_status(test_counts.get_status()) kunit_status = _map_to_overall_status(test_counts.get_status())
return KunitResult(status=kunit_status, result=result.result, elapsed_time=exec_time) return KunitResult(status=kunit_status, result=result, elapsed_time=exec_time)
def _map_to_overall_status(test_status: kunit_parser.TestStatus) -> KunitStatus: def _map_to_overall_status(test_status: kunit_parser.TestStatus) -> KunitStatus:
if test_status in (kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SKIPPED): if test_status in (kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SKIPPED):
@ -192,14 +192,12 @@ def _map_to_overall_status(test_status: kunit_parser.TestStatus) -> KunitStatus:
def parse_tests(request: KunitParseRequest, input_data: Iterable[str]) -> KunitResult: def parse_tests(request: KunitParseRequest, input_data: Iterable[str]) -> KunitResult:
parse_start = time.time() parse_start = time.time()
test_result = kunit_parser.TestResult(kunit_parser.TestStatus.SUCCESS, test_result = kunit_parser.Test()
kunit_parser.Test(),
'Tests not Parsed.')
if request.raw_output: if request.raw_output:
# Treat unparsed results as one passing test. # Treat unparsed results as one passing test.
test_result.test.status = kunit_parser.TestStatus.SUCCESS test_result.status = kunit_parser.TestStatus.SUCCESS
test_result.test.counts.passed = 1 test_result.counts.passed = 1
output: Iterable[str] = input_data output: Iterable[str] = input_data
if request.raw_output == 'all': if request.raw_output == 'all':
@ -217,7 +215,7 @@ def parse_tests(request: KunitParseRequest, input_data: Iterable[str]) -> KunitR
if request.json: if request.json:
json_obj = kunit_json.get_json_result( json_obj = kunit_json.get_json_result(
test_result=test_result, test=test_result,
def_config='kunit_defconfig', def_config='kunit_defconfig',
build_dir=request.build_dir, build_dir=request.build_dir,
json_path=request.json) json_path=request.json)

View File

@ -11,7 +11,7 @@ import os
import kunit_parser import kunit_parser
from kunit_parser import Test, TestResult, TestStatus from kunit_parser import Test, TestStatus
from typing import Any, Dict, Optional from typing import Any, Dict, Optional
JsonObj = Dict[str, Any] JsonObj = Dict[str, Any]
@ -50,9 +50,9 @@ def _get_group_json(test: Test, def_config: str,
} }
return test_group return test_group
def get_json_result(test_result: TestResult, def_config: str, def get_json_result(test: Test, def_config: str,
build_dir: Optional[str], json_path: str) -> str: build_dir: Optional[str], json_path: str) -> str:
test_group = _get_group_json(test_result.test, def_config, build_dir) test_group = _get_group_json(test, def_config, build_dir)
test_group["name"] = "KUnit Test Group" test_group["name"] = "KUnit Test Group"
json_obj = json.dumps(test_group, indent=4) json_obj = json.dumps(test_group, indent=4)
if json_path != 'stdout': if json_path != 'stdout':

View File

@ -12,14 +12,11 @@
from __future__ import annotations from __future__ import annotations
import re import re
from collections import namedtuple
from datetime import datetime from datetime import datetime
from enum import Enum, auto from enum import Enum, auto
from functools import reduce from functools import reduce
from typing import Iterable, Iterator, List, Optional, Tuple from typing import Iterable, Iterator, List, Optional, Tuple
TestResult = namedtuple('TestResult', ['status','test','log'])
class Test(object): class Test(object):
""" """
A class to represent a test parsed from KTAP results. All KTAP A class to represent a test parsed from KTAP results. All KTAP
@ -805,7 +802,7 @@ def parse_test(lines: LineStream, expected_num: int, log: List[str]) -> Test:
print_test_result(test) print_test_result(test)
return test return test
def parse_run_tests(kernel_output: Iterable[str]) -> TestResult: def parse_run_tests(kernel_output: Iterable[str]) -> Test:
""" """
Using kernel output, extract KTAP lines, parse the lines for test Using kernel output, extract KTAP lines, parse the lines for test
results and print condensed test results and summary line . results and print condensed test results and summary line .
@ -814,8 +811,7 @@ def parse_run_tests(kernel_output: Iterable[str]) -> TestResult:
kernel_output - Iterable object contains lines of kernel output kernel_output - Iterable object contains lines of kernel output
Return: Return:
TestResult - Tuple containg status of main test object, main test Test - the main test object with all subtests.
object with all subtests, and log of all KTAP lines.
""" """
print_with_timestamp(DIVIDER) print_with_timestamp(DIVIDER)
lines = extract_tap_lines(kernel_output) lines = extract_tap_lines(kernel_output)
@ -829,4 +825,4 @@ def parse_run_tests(kernel_output: Iterable[str]) -> TestResult:
test.status = test.counts.get_status() test.status = test.counts.get_status()
print_with_timestamp(DIVIDER) print_with_timestamp(DIVIDER)
print_summary_line(test) print_summary_line(test)
return TestResult(test.status, test, lines) return test

View File

@ -178,7 +178,7 @@ class KUnitParserTest(unittest.TestCase):
with open(empty_log) as file: with open(empty_log) as file:
result = kunit_parser.parse_run_tests( result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines())) kunit_parser.extract_tap_lines(file.readlines()))
self.assertEqual(0, len(result.test.subtests)) self.assertEqual(0, len(result.subtests))
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.FAILURE_TO_PARSE_TESTS, kunit_parser.TestStatus.FAILURE_TO_PARSE_TESTS,
result.status) result.status)
@ -191,9 +191,9 @@ class KUnitParserTest(unittest.TestCase):
kunit_parser.extract_tap_lines( kunit_parser.extract_tap_lines(
file.readlines())) file.readlines()))
# A missing test plan is not an error. # A missing test plan is not an error.
self.assertEqual(0, result.test.counts.errors) self.assertEqual(0, result.counts.errors)
# All tests should be accounted for. # All tests should be accounted for.
self.assertEqual(10, result.test.counts.total()) self.assertEqual(10, result.counts.total())
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SUCCESS,
result.status) result.status)
@ -203,7 +203,7 @@ class KUnitParserTest(unittest.TestCase):
with open(header_log) as file: with open(header_log) as file:
result = kunit_parser.parse_run_tests( result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines())) kunit_parser.extract_tap_lines(file.readlines()))
self.assertEqual(0, len(result.test.subtests)) self.assertEqual(0, len(result.subtests))
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.NO_TESTS, kunit_parser.TestStatus.NO_TESTS,
result.status) result.status)
@ -213,11 +213,11 @@ class KUnitParserTest(unittest.TestCase):
with open(no_plan_log) as file: with open(no_plan_log) as file:
result = kunit_parser.parse_run_tests( result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines())) kunit_parser.extract_tap_lines(file.readlines()))
self.assertEqual(0, len(result.test.subtests[0].subtests[0].subtests)) self.assertEqual(0, len(result.subtests[0].subtests[0].subtests))
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.NO_TESTS, kunit_parser.TestStatus.NO_TESTS,
result.test.subtests[0].subtests[0].status) result.subtests[0].subtests[0].status)
self.assertEqual(1, result.test.counts.errors) self.assertEqual(1, result.counts.errors)
def test_no_kunit_output(self): def test_no_kunit_output(self):
@ -228,7 +228,7 @@ class KUnitParserTest(unittest.TestCase):
kunit_parser.extract_tap_lines(file.readlines())) kunit_parser.extract_tap_lines(file.readlines()))
print_mock.assert_any_call(StrContains('invalid KTAP input!')) print_mock.assert_any_call(StrContains('invalid KTAP input!'))
print_mock.stop() print_mock.stop()
self.assertEqual(0, len(result.test.subtests)) self.assertEqual(0, len(result.subtests))
def test_crashed_test(self): def test_crashed_test(self):
crashed_log = test_data_path('test_is_test_passed-crash.log') crashed_log = test_data_path('test_is_test_passed-crash.log')
@ -269,10 +269,10 @@ class KUnitParserTest(unittest.TestCase):
result.status) result.status)
self.assertEqual( self.assertEqual(
"sysctl_test", "sysctl_test",
result.test.subtests[0].name) result.subtests[0].name)
self.assertEqual( self.assertEqual(
"example", "example",
result.test.subtests[1].name) result.subtests[1].name)
file.close() file.close()
@ -283,7 +283,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SUCCESS,
result.status) result.status)
self.assertEqual('kunit-resource-test', result.test.subtests[0].name) self.assertEqual('kunit-resource-test', result.subtests[0].name)
def test_ignores_multiple_prefixes(self): def test_ignores_multiple_prefixes(self):
prefix_log = test_data_path('test_multiple_prefixes.log') prefix_log = test_data_path('test_multiple_prefixes.log')
@ -292,7 +292,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SUCCESS,
result.status) result.status)
self.assertEqual('kunit-resource-test', result.test.subtests[0].name) self.assertEqual('kunit-resource-test', result.subtests[0].name)
def test_prefix_mixed_kernel_output(self): def test_prefix_mixed_kernel_output(self):
mixed_prefix_log = test_data_path('test_interrupted_tap_output.log') mixed_prefix_log = test_data_path('test_interrupted_tap_output.log')
@ -301,7 +301,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SUCCESS,
result.status) result.status)
self.assertEqual('kunit-resource-test', result.test.subtests[0].name) self.assertEqual('kunit-resource-test', result.subtests[0].name)
def test_prefix_poundsign(self): def test_prefix_poundsign(self):
pound_log = test_data_path('test_pound_sign.log') pound_log = test_data_path('test_pound_sign.log')
@ -310,7 +310,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SUCCESS,
result.status) result.status)
self.assertEqual('kunit-resource-test', result.test.subtests[0].name) self.assertEqual('kunit-resource-test', result.subtests[0].name)
def test_kernel_panic_end(self): def test_kernel_panic_end(self):
panic_log = test_data_path('test_kernel_panic_interrupt.log') panic_log = test_data_path('test_kernel_panic_interrupt.log')
@ -319,7 +319,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.TEST_CRASHED, kunit_parser.TestStatus.TEST_CRASHED,
result.status) result.status)
self.assertEqual('kunit-resource-test', result.test.subtests[0].name) self.assertEqual('kunit-resource-test', result.subtests[0].name)
def test_pound_no_prefix(self): def test_pound_no_prefix(self):
pound_log = test_data_path('test_pound_no_prefix.log') pound_log = test_data_path('test_pound_no_prefix.log')
@ -328,7 +328,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual( self.assertEqual(
kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SUCCESS,
result.status) result.status)
self.assertEqual('kunit-resource-test', result.test.subtests[0].name) self.assertEqual('kunit-resource-test', result.subtests[0].name)
def line_stream_from_strs(strs: Iterable[str]) -> kunit_parser.LineStream: def line_stream_from_strs(strs: Iterable[str]) -> kunit_parser.LineStream:
return kunit_parser.LineStream(enumerate(strs, start=1)) return kunit_parser.LineStream(enumerate(strs, start=1))
@ -467,7 +467,7 @@ class KUnitJsonTest(unittest.TestCase):
with open(test_data_path(log_file)) as file: with open(test_data_path(log_file)) as file:
test_result = kunit_parser.parse_run_tests(file) test_result = kunit_parser.parse_run_tests(file)
json_obj = kunit_json.get_json_result( json_obj = kunit_json.get_json_result(
test_result=test_result, test=test_result,
def_config='kunit_defconfig', def_config='kunit_defconfig',
build_dir=None, build_dir=None,
json_path='stdout') json_path='stdout')