Skip to content

Commit

Permalink
kunit: tool: delete kunit_parser.TestResult type
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Daniel Latypov authored and Shuah Khan committed Dec 15, 2021
1 parent db16798 commit e0cc8c0
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 35 deletions.
14 changes: 6 additions & 8 deletions tools/testing/kunit/kunit.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ def exec_tests(linux: kunit_kernel.LinuxSourceTree, request: KunitExecRequest) -
test_end = time.time()
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:
bd = request.build_dir
Expand All @@ -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]))

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:
if test_status in (kunit_parser.TestStatus.SUCCESS, kunit_parser.TestStatus.SKIPPED):
Expand All @@ -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:
parse_start = time.time()

test_result = kunit_parser.TestResult(kunit_parser.TestStatus.SUCCESS,
kunit_parser.Test(),
'Tests not Parsed.')
test_result = kunit_parser.Test()

if request.raw_output:
# Treat unparsed results as one passing test.
test_result.test.status = kunit_parser.TestStatus.SUCCESS
test_result.test.counts.passed = 1
test_result.status = kunit_parser.TestStatus.SUCCESS
test_result.counts.passed = 1

output: Iterable[str] = input_data
if request.raw_output == 'all':
Expand All @@ -217,7 +215,7 @@ def parse_tests(request: KunitParseRequest, input_data: Iterable[str]) -> KunitR

if request.json:
json_obj = kunit_json.get_json_result(
test_result=test_result,
test=test_result,
def_config='kunit_defconfig',
build_dir=request.build_dir,
json_path=request.json)
Expand Down
6 changes: 3 additions & 3 deletions tools/testing/kunit/kunit_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

import kunit_parser

from kunit_parser import Test, TestResult, TestStatus
from kunit_parser import Test, TestStatus
from typing import Any, Dict, Optional

JsonObj = Dict[str, Any]
Expand Down Expand Up @@ -50,9 +50,9 @@ def _get_group_json(test: Test, def_config: str,
}
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:
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"
json_obj = json.dumps(test_group, indent=4)
if json_path != 'stdout':
Expand Down
10 changes: 3 additions & 7 deletions tools/testing/kunit/kunit_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,11 @@
from __future__ import annotations
import re

from collections import namedtuple
from datetime import datetime
from enum import Enum, auto
from functools import reduce
from typing import Iterable, Iterator, List, Optional, Tuple

TestResult = namedtuple('TestResult', ['status','test','log'])

class Test(object):
"""
A class to represent a test parsed from KTAP results. All KTAP
Expand Down Expand Up @@ -805,7 +802,7 @@ def parse_test(lines: LineStream, expected_num: int, log: List[str]) -> Test:
print_test_result(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
results and print condensed test results and summary line .
Expand All @@ -814,8 +811,7 @@ def parse_run_tests(kernel_output: Iterable[str]) -> TestResult:
kernel_output - Iterable object contains lines of kernel output
Return:
TestResult - Tuple containg status of main test object, main test
object with all subtests, and log of all KTAP lines.
Test - the main test object with all subtests.
"""
print_with_timestamp(DIVIDER)
lines = extract_tap_lines(kernel_output)
Expand All @@ -829,4 +825,4 @@ def parse_run_tests(kernel_output: Iterable[str]) -> TestResult:
test.status = test.counts.get_status()
print_with_timestamp(DIVIDER)
print_summary_line(test)
return TestResult(test.status, test, lines)
return test
34 changes: 17 additions & 17 deletions tools/testing/kunit/kunit_tool_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ def test_no_header(self):
with open(empty_log) as file:
result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines()))
self.assertEqual(0, len(result.test.subtests))
self.assertEqual(0, len(result.subtests))
self.assertEqual(
kunit_parser.TestStatus.FAILURE_TO_PARSE_TESTS,
result.status)
Expand All @@ -191,9 +191,9 @@ def test_missing_test_plan(self):
kunit_parser.extract_tap_lines(
file.readlines()))
# 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.
self.assertEqual(10, result.test.counts.total())
self.assertEqual(10, result.counts.total())
self.assertEqual(
kunit_parser.TestStatus.SUCCESS,
result.status)
Expand All @@ -203,7 +203,7 @@ def test_no_tests(self):
with open(header_log) as file:
result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines()))
self.assertEqual(0, len(result.test.subtests))
self.assertEqual(0, len(result.subtests))
self.assertEqual(
kunit_parser.TestStatus.NO_TESTS,
result.status)
Expand All @@ -213,11 +213,11 @@ def test_no_tests_no_plan(self):
with open(no_plan_log) as file:
result = kunit_parser.parse_run_tests(
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(
kunit_parser.TestStatus.NO_TESTS,
result.test.subtests[0].subtests[0].status)
self.assertEqual(1, result.test.counts.errors)
result.subtests[0].subtests[0].status)
self.assertEqual(1, result.counts.errors)


def test_no_kunit_output(self):
Expand All @@ -228,7 +228,7 @@ def test_no_kunit_output(self):
kunit_parser.extract_tap_lines(file.readlines()))
print_mock.assert_any_call(StrContains('invalid KTAP input!'))
print_mock.stop()
self.assertEqual(0, len(result.test.subtests))
self.assertEqual(0, len(result.subtests))

def test_crashed_test(self):
crashed_log = test_data_path('test_is_test_passed-crash.log')
Expand Down Expand Up @@ -269,10 +269,10 @@ def test_ignores_hyphen(self):
result.status)
self.assertEqual(
"sysctl_test",
result.test.subtests[0].name)
result.subtests[0].name)
self.assertEqual(
"example",
result.test.subtests[1].name)
result.subtests[1].name)
file.close()


Expand All @@ -283,7 +283,7 @@ def test_ignores_prefix_printk_time(self):
self.assertEqual(
kunit_parser.TestStatus.SUCCESS,
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):
prefix_log = test_data_path('test_multiple_prefixes.log')
Expand All @@ -292,7 +292,7 @@ def test_ignores_multiple_prefixes(self):
self.assertEqual(
kunit_parser.TestStatus.SUCCESS,
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):
mixed_prefix_log = test_data_path('test_interrupted_tap_output.log')
Expand All @@ -301,7 +301,7 @@ def test_prefix_mixed_kernel_output(self):
self.assertEqual(
kunit_parser.TestStatus.SUCCESS,
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):
pound_log = test_data_path('test_pound_sign.log')
Expand All @@ -310,7 +310,7 @@ def test_prefix_poundsign(self):
self.assertEqual(
kunit_parser.TestStatus.SUCCESS,
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):
panic_log = test_data_path('test_kernel_panic_interrupt.log')
Expand All @@ -319,7 +319,7 @@ def test_kernel_panic_end(self):
self.assertEqual(
kunit_parser.TestStatus.TEST_CRASHED,
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):
pound_log = test_data_path('test_pound_no_prefix.log')
Expand All @@ -328,7 +328,7 @@ def test_pound_no_prefix(self):
self.assertEqual(
kunit_parser.TestStatus.SUCCESS,
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:
return kunit_parser.LineStream(enumerate(strs, start=1))
Expand Down Expand Up @@ -467,7 +467,7 @@ def _json_for(self, log_file):
with open(test_data_path(log_file)) as file:
test_result = kunit_parser.parse_run_tests(file)
json_obj = kunit_json.get_json_result(
test_result=test_result,
test=test_result,
def_config='kunit_defconfig',
build_dir=None,
json_path='stdout')
Expand Down

0 comments on commit e0cc8c0

Please sign in to comment.