Commit 5937e0c0 authored by Daniel Latypov's avatar Daniel Latypov Committed by Shuah Khan

kunit: tool: don't include KTAP headers and the like in the test log

We print the "test log" on failure.
This is meant to be all the kernel output that happened during the test.

But we also include the special KTAP lines in it, which are often
redundant.

E.g. we include the "not ok" line in the log, right before we print
that the test case failed...
[13:51:48] Expected 2 + 1 == 2, but
[13:51:48] 2 + 1 == 3 (0x3)
[13:51:48] not ok 1 example_simple_test
[13:51:48] [FAILED] example_simple_test

More full example after this patch:
[13:51:48] =================== example (4 subtests) ===================
[13:51:48] # example_simple_test: initializing
[13:51:48] # example_simple_test: EXPECTATION FAILED at lib/kunit/kunit-example-test.c:29
[13:51:48] Expected 2 + 1 == 2, but
[13:51:48] 2 + 1 == 3 (0x3)
[13:51:48] [FAILED] example_simple_test
Signed-off-by: default avatarDaniel Latypov <dlatypov@google.com>
Reviewed-by: default avatarDavid Gow <davidgow@google.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent 6c738b52
...@@ -295,7 +295,7 @@ def parse_ktap_header(lines: LineStream, test: Test) -> bool: ...@@ -295,7 +295,7 @@ def parse_ktap_header(lines: LineStream, test: Test) -> bool:
check_version(version_num, TAP_VERSIONS, 'TAP', test) check_version(version_num, TAP_VERSIONS, 'TAP', test)
else: else:
return False return False
test.log.append(lines.pop()) lines.pop()
return True return True
TEST_HEADER = re.compile(r'^# Subtest: (.*)$') TEST_HEADER = re.compile(r'^# Subtest: (.*)$')
...@@ -318,8 +318,8 @@ def parse_test_header(lines: LineStream, test: Test) -> bool: ...@@ -318,8 +318,8 @@ def parse_test_header(lines: LineStream, test: Test) -> bool:
match = TEST_HEADER.match(lines.peek()) match = TEST_HEADER.match(lines.peek())
if not match: if not match:
return False return False
test.log.append(lines.pop())
test.name = match.group(1) test.name = match.group(1)
lines.pop()
return True return True
TEST_PLAN = re.compile(r'1\.\.([0-9]+)') TEST_PLAN = re.compile(r'1\.\.([0-9]+)')
...@@ -345,9 +345,9 @@ def parse_test_plan(lines: LineStream, test: Test) -> bool: ...@@ -345,9 +345,9 @@ def parse_test_plan(lines: LineStream, test: Test) -> bool:
if not match: if not match:
test.expected_count = None test.expected_count = None
return False return False
test.log.append(lines.pop())
expected_count = int(match.group(1)) expected_count = int(match.group(1))
test.expected_count = expected_count test.expected_count = expected_count
lines.pop()
return True return True
TEST_RESULT = re.compile(r'^(ok|not ok) ([0-9]+) (- )?([^#]*)( # .*)?$') TEST_RESULT = re.compile(r'^(ok|not ok) ([0-9]+) (- )?([^#]*)( # .*)?$')
...@@ -409,7 +409,7 @@ def parse_test_result(lines: LineStream, test: Test, ...@@ -409,7 +409,7 @@ def parse_test_result(lines: LineStream, test: Test,
# Check if line matches test result line format # Check if line matches test result line format
if not match: if not match:
return False return False
test.log.append(lines.pop()) lines.pop()
# Set name of test object # Set name of test object
if skip_match: if skip_match:
......
...@@ -84,6 +84,10 @@ class KUnitParserTest(unittest.TestCase): ...@@ -84,6 +84,10 @@ class KUnitParserTest(unittest.TestCase):
self.print_mock = mock.patch('kunit_printer.Printer.print').start() self.print_mock = mock.patch('kunit_printer.Printer.print').start()
self.addCleanup(mock.patch.stopall) self.addCleanup(mock.patch.stopall)
def noPrintCallContains(self, substr: str):
for call in self.print_mock.mock_calls:
self.assertNotIn(substr, call.args[0])
def assertContains(self, needle: str, haystack: kunit_parser.LineStream): def assertContains(self, needle: str, haystack: kunit_parser.LineStream):
# Clone the iterator so we can print the contents on failure. # Clone the iterator so we can print the contents on failure.
copy, backup = itertools.tee(haystack) copy, backup = itertools.tee(haystack)
...@@ -327,6 +331,19 @@ class KUnitParserTest(unittest.TestCase): ...@@ -327,6 +331,19 @@ class KUnitParserTest(unittest.TestCase):
result = kunit_parser.parse_run_tests(file.readlines()) result = kunit_parser.parse_run_tests(file.readlines())
self.print_mock.assert_any_call(StrContains('suite (1 subtest)')) self.print_mock.assert_any_call(StrContains('suite (1 subtest)'))
def test_show_test_output_on_failure(self):
output = """
KTAP version 1
1..1
Test output.
not ok 1 test1
"""
result = kunit_parser.parse_run_tests(output.splitlines())
self.assertEqual(kunit_parser.TestStatus.FAILURE, result.status)
self.print_mock.assert_any_call(StrContains('Test output.'))
self.noPrintCallContains('not ok 1 test1')
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))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment