Commit e0cc8c05 authored by Daniel Latypov's avatar Daniel Latypov Committed by Shuah Khan
Browse files

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: default avatarDaniel Latypov <dlatypov@google.com>
Reviewed-by: default avatarBrendan Higgins <brendanhiggins@google.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent db167981
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -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
@@ -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):
@@ -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':
@@ -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)
+3 −3
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ import os

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]
@@ -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':
+3 −7
Original line number Diff line number Diff line
@@ -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
@@ -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 .
@@ -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)
@@ -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
+17 −17
Original line number Diff line number Diff line
@@ -178,7 +178,7 @@ class KUnitParserTest(unittest.TestCase):
		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)
@@ -191,9 +191,9 @@ class KUnitParserTest(unittest.TestCase):
				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)
@@ -203,7 +203,7 @@ class KUnitParserTest(unittest.TestCase):
		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)
@@ -213,11 +213,11 @@ class KUnitParserTest(unittest.TestCase):
		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):
@@ -228,7 +228,7 @@ class KUnitParserTest(unittest.TestCase):
				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')
@@ -269,10 +269,10 @@ class KUnitParserTest(unittest.TestCase):
			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()


@@ -283,7 +283,7 @@ class KUnitParserTest(unittest.TestCase):
			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')
@@ -292,7 +292,7 @@ class KUnitParserTest(unittest.TestCase):
			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')
@@ -301,7 +301,7 @@ class KUnitParserTest(unittest.TestCase):
			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')
@@ -310,7 +310,7 @@ class KUnitParserTest(unittest.TestCase):
			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')
@@ -319,7 +319,7 @@ class KUnitParserTest(unittest.TestCase):
			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')
@@ -328,7 +328,7 @@ class KUnitParserTest(unittest.TestCase):
			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))
@@ -467,7 +467,7 @@ class KUnitJsonTest(unittest.TestCase):
		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')