* [PATCH 0/2] kunit: tool: test: Allow running with pytest
@ 2025-12-30 12:56 Thomas Weißschuh
2025-12-30 12:56 ` [PATCH 1/2] kunit: tool: test: Rename test_data_path() to _test_data_path() Thomas Weißschuh
2025-12-30 12:56 ` [PATCH 2/2] kunit: tool: test: Don't rely on implicit working directory change Thomas Weißschuh
0 siblings, 2 replies; 5+ messages in thread
From: Thomas Weißschuh @ 2025-12-30 12:56 UTC (permalink / raw)
To: Brendan Higgins, David Gow, Rae Moar
Cc: linux-kselftest, kunit-dev, linux-kernel, Thomas Weißschuh
pytest can run unittest-based testsuites, like kunit_tool_test.py.
It has a more features than the standard runner.
Unfortunately a few minor issues currently break this.
Adapt the testsuite to work with pytest.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
Thomas Weißschuh (2):
kunit: tool: test: Rename test_data_path() to _test_data_path()
kunit: tool: test: Don't rely on implicit working directory change
tools/testing/kunit/kunit_tool_test.py | 59 +++++++++++++++++-----------------
1 file changed, 30 insertions(+), 29 deletions(-)
---
base-commit: a77b19b747c8a53ac16289685b0f77085a2ad553
change-id: 20251230-kunit-pytest-259a1eb36a42
Best regards,
--
Thomas Weißschuh <thomas.weissschuh@linutronix.de>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2] kunit: tool: test: Rename test_data_path() to _test_data_path()
2025-12-30 12:56 [PATCH 0/2] kunit: tool: test: Allow running with pytest Thomas Weißschuh
@ 2025-12-30 12:56 ` Thomas Weißschuh
2026-01-05 8:56 ` David Gow
2025-12-30 12:56 ` [PATCH 2/2] kunit: tool: test: Don't rely on implicit working directory change Thomas Weißschuh
1 sibling, 1 reply; 5+ messages in thread
From: Thomas Weißschuh @ 2025-12-30 12:56 UTC (permalink / raw)
To: Brendan Higgins, David Gow, Rae Moar
Cc: linux-kselftest, kunit-dev, linux-kernel, Thomas Weißschuh
Running the KUnit testsuite through pytest fails, as the function
test_data_path() is recognized as a test function. Its execution fails
as pytest tries to resolve the 'path' argument as a fixture which does
not exist.
Rename the function, so the helper function is not incorrectly
recognized as a test function.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
tools/testing/kunit/kunit_tool_test.py | 54 +++++++++++++++++-----------------
1 file changed, 27 insertions(+), 27 deletions(-)
diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py
index bbba921e0eac..fd7ca89596c0 100755
--- a/tools/testing/kunit/kunit_tool_test.py
+++ b/tools/testing/kunit/kunit_tool_test.py
@@ -36,7 +36,7 @@ def setUpModule():
def tearDownModule():
shutil.rmtree(test_tmpdir)
-def test_data_path(path):
+def _test_data_path(path):
return os.path.join(abs_test_data_dir, path)
class KconfigTest(unittest.TestCase):
@@ -52,7 +52,7 @@ class KconfigTest(unittest.TestCase):
self.assertFalse(kconfig1.is_subset_of(kconfig0))
def test_read_from_file(self):
- kconfig_path = test_data_path('test_read_from_file.kconfig')
+ kconfig_path = _test_data_path('test_read_from_file.kconfig')
kconfig = kunit_config.parse_file(kconfig_path)
@@ -98,7 +98,7 @@ class KUnitParserTest(unittest.TestCase):
raise AssertionError(f'"{needle}" not found in {list(backup)}!')
def test_output_isolated_correctly(self):
- log_path = test_data_path('test_output_isolated_correctly.log')
+ log_path = _test_data_path('test_output_isolated_correctly.log')
with open(log_path) as file:
result = kunit_parser.extract_tap_lines(file.readlines())
self.assertContains('TAP version 14', result)
@@ -109,7 +109,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertContains('ok 1 - example', result)
def test_output_with_prefix_isolated_correctly(self):
- log_path = test_data_path('test_pound_sign.log')
+ log_path = _test_data_path('test_pound_sign.log')
with open(log_path) as file:
result = kunit_parser.extract_tap_lines(file.readlines())
self.assertContains('TAP version 14', result)
@@ -138,35 +138,35 @@ class KUnitParserTest(unittest.TestCase):
self.assertContains('ok 3 - string-stream-test', result)
def test_parse_successful_test_log(self):
- all_passed_log = test_data_path('test_is_test_passed-all_passed.log')
+ all_passed_log = _test_data_path('test_is_test_passed-all_passed.log')
with open(all_passed_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
self.assertEqual(result.counts.errors, 0)
def test_parse_successful_nested_tests_log(self):
- all_passed_log = test_data_path('test_is_test_passed-all_passed_nested.log')
+ all_passed_log = _test_data_path('test_is_test_passed-all_passed_nested.log')
with open(all_passed_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
self.assertEqual(result.counts.errors, 0)
def test_kselftest_nested(self):
- kselftest_log = test_data_path('test_is_test_passed-kselftest.log')
+ kselftest_log = _test_data_path('test_is_test_passed-kselftest.log')
with open(kselftest_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
self.assertEqual(result.counts.errors, 0)
def test_parse_failed_test_log(self):
- failed_log = test_data_path('test_is_test_passed-failure.log')
+ failed_log = _test_data_path('test_is_test_passed-failure.log')
with open(failed_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.FAILURE, result.status)
self.assertEqual(result.counts.errors, 0)
def test_no_header(self):
- empty_log = test_data_path('test_is_test_passed-no_tests_run_no_header.log')
+ empty_log = _test_data_path('test_is_test_passed-no_tests_run_no_header.log')
with open(empty_log) as file:
result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines()), stdout)
@@ -175,7 +175,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts.errors, 1)
def test_missing_test_plan(self):
- missing_plan_log = test_data_path('test_is_test_passed-'
+ missing_plan_log = _test_data_path('test_is_test_passed-'
'missing_plan.log')
with open(missing_plan_log) as file:
result = kunit_parser.parse_run_tests(
@@ -186,7 +186,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
def test_no_tests(self):
- header_log = test_data_path('test_is_test_passed-no_tests_run_with_header.log')
+ header_log = _test_data_path('test_is_test_passed-no_tests_run_with_header.log')
with open(header_log) as file:
result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines()), stdout)
@@ -195,7 +195,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts.errors, 1)
def test_no_tests_no_plan(self):
- no_plan_log = test_data_path('test_is_test_passed-no_tests_no_plan.log')
+ no_plan_log = _test_data_path('test_is_test_passed-no_tests_no_plan.log')
with open(no_plan_log) as file:
result = kunit_parser.parse_run_tests(
kunit_parser.extract_tap_lines(file.readlines()), stdout)
@@ -207,7 +207,7 @@ class KUnitParserTest(unittest.TestCase):
def test_no_kunit_output(self):
- crash_log = test_data_path('test_insufficient_memory.log')
+ crash_log = _test_data_path('test_insufficient_memory.log')
print_mock = mock.patch('kunit_printer.Printer.print').start()
with open(crash_log) as file:
result = kunit_parser.parse_run_tests(
@@ -218,7 +218,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts.errors, 1)
def test_skipped_test(self):
- skipped_log = test_data_path('test_skip_tests.log')
+ skipped_log = _test_data_path('test_skip_tests.log')
with open(skipped_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
@@ -227,7 +227,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts, kunit_parser.TestCounts(passed=4, skipped=1))
def test_skipped_all_tests(self):
- skipped_log = test_data_path('test_skip_all_tests.log')
+ skipped_log = _test_data_path('test_skip_all_tests.log')
with open(skipped_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
@@ -235,7 +235,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts, kunit_parser.TestCounts(skipped=5))
def test_ignores_hyphen(self):
- hyphen_log = test_data_path('test_strip_hyphen.log')
+ hyphen_log = _test_data_path('test_strip_hyphen.log')
with open(hyphen_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
@@ -249,7 +249,7 @@ class KUnitParserTest(unittest.TestCase):
result.subtests[1].name)
def test_ignores_prefix_printk_time(self):
- prefix_log = test_data_path('test_config_printk_time.log')
+ prefix_log = _test_data_path('test_config_printk_time.log')
with open(prefix_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
@@ -257,7 +257,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts.errors, 0)
def test_ignores_multiple_prefixes(self):
- prefix_log = test_data_path('test_multiple_prefixes.log')
+ prefix_log = _test_data_path('test_multiple_prefixes.log')
with open(prefix_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
@@ -265,7 +265,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts.errors, 0)
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')
with open(mixed_prefix_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
@@ -273,7 +273,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts.errors, 0)
def test_prefix_poundsign(self):
- pound_log = test_data_path('test_pound_sign.log')
+ pound_log = _test_data_path('test_pound_sign.log')
with open(pound_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
@@ -281,7 +281,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual(result.counts.errors, 0)
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')
with open(panic_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.TEST_CRASHED, result.status)
@@ -289,7 +289,7 @@ class KUnitParserTest(unittest.TestCase):
self.assertGreaterEqual(result.counts.errors, 1)
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')
with open(pound_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
@@ -318,7 +318,7 @@ class KUnitParserTest(unittest.TestCase):
'Failures: all_failed_suite, some_failed_suite.test2')
def test_ktap_format(self):
- ktap_log = test_data_path('test_parse_ktap_output.log')
+ ktap_log = _test_data_path('test_parse_ktap_output.log')
with open(ktap_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
self.assertEqual(result.counts, kunit_parser.TestCounts(passed=3))
@@ -327,13 +327,13 @@ class KUnitParserTest(unittest.TestCase):
self.assertEqual('case_2', result.subtests[0].subtests[1].name)
def test_parse_subtest_header(self):
- ktap_log = test_data_path('test_parse_subtest_header.log')
+ ktap_log = _test_data_path('test_parse_subtest_header.log')
with open(ktap_log) as file:
kunit_parser.parse_run_tests(file.readlines(), stdout)
self.print_mock.assert_any_call(StrContains('suite (1 subtest)'))
def test_parse_attributes(self):
- ktap_log = test_data_path('test_parse_attributes.log')
+ ktap_log = _test_data_path('test_parse_attributes.log')
with open(ktap_log) as file:
result = kunit_parser.parse_run_tests(file.readlines(), stdout)
@@ -555,7 +555,7 @@ class KUnitJsonTest(unittest.TestCase):
self.addCleanup(mock.patch.stopall)
def _json_for(self, log_file):
- 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, stdout)
json_obj = kunit_json.get_json_result(
test=test_result,
@@ -596,7 +596,7 @@ class StrContains(str):
class KUnitMainTest(unittest.TestCase):
def setUp(self):
- path = test_data_path('test_is_test_passed-all_passed.log')
+ path = _test_data_path('test_is_test_passed-all_passed.log')
with open(path) as file:
all_passed_log = file.readlines()
--
2.52.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2] kunit: tool: test: Don't rely on implicit working directory change
2025-12-30 12:56 [PATCH 0/2] kunit: tool: test: Allow running with pytest Thomas Weißschuh
2025-12-30 12:56 ` [PATCH 1/2] kunit: tool: test: Rename test_data_path() to _test_data_path() Thomas Weißschuh
@ 2025-12-30 12:56 ` Thomas Weißschuh
2026-01-05 8:56 ` David Gow
1 sibling, 1 reply; 5+ messages in thread
From: Thomas Weißschuh @ 2025-12-30 12:56 UTC (permalink / raw)
To: Brendan Higgins, David Gow, Rae Moar
Cc: linux-kselftest, kunit-dev, linux-kernel, Thomas Weißschuh
If no kunitconfig_paths are passed to LinuxSourceTree() it falls back to
DEFAULT_KUNITCONFIG_PATH. This resolution only works when the current
working directory is the root of the source tree. This works by chance
when running the full testsuite through the default unittest runner, as
some tests will change the current working directory as a side-effect of
'kunit.main()'. When running a single testcase or using pytest, which
resets the working directory for each test, this assumption breaks.
Explicitly specify an empty kunitconfig for the affected tests.
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
tools/testing/kunit/kunit_tool_test.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py
index fd7ca89596c0..584275ce6ba6 100755
--- a/tools/testing/kunit/kunit_tool_test.py
+++ b/tools/testing/kunit/kunit_tool_test.py
@@ -466,7 +466,8 @@ class LinuxSourceTreeTest(unittest.TestCase):
want_kconfig = kunit_config.Kconfig()
want_kconfig.add_entry('NOT_REAL', 'y')
- tree = kunit_kernel.LinuxSourceTree('', kconfig_add=['CONFIG_NOT_REAL=y'])
+ tree = kunit_kernel.LinuxSourceTree('', kunitconfig_paths=[os.devnull],
+ kconfig_add=['CONFIG_NOT_REAL=y'])
self.assertTrue(want_kconfig.is_subset_of(tree._kconfig), msg=tree._kconfig)
def test_invalid_arch(self):
@@ -478,7 +479,7 @@ class LinuxSourceTreeTest(unittest.TestCase):
return subprocess.Popen(['echo "hi\nbye"'], shell=True, text=True, stdout=subprocess.PIPE)
with tempfile.TemporaryDirectory('') as build_dir:
- tree = kunit_kernel.LinuxSourceTree(build_dir)
+ tree = kunit_kernel.LinuxSourceTree(build_dir, kunitconfig_paths=[os.devnull])
mock.patch.object(tree._ops, 'start', side_effect=fake_start).start()
with self.assertRaises(ValueError):
--
2.52.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] kunit: tool: test: Rename test_data_path() to _test_data_path()
2025-12-30 12:56 ` [PATCH 1/2] kunit: tool: test: Rename test_data_path() to _test_data_path() Thomas Weißschuh
@ 2026-01-05 8:56 ` David Gow
0 siblings, 0 replies; 5+ messages in thread
From: David Gow @ 2026-01-05 8:56 UTC (permalink / raw)
To: Thomas Weißschuh
Cc: Brendan Higgins, Rae Moar, linux-kselftest, kunit-dev,
linux-kernel
[-- Attachment #1: Type: text/plain, Size: 14961 bytes --]
On Tue, 30 Dec 2025 at 20:56, Thomas Weißschuh
<thomas.weissschuh@linutronix.de> wrote:
>
> Running the KUnit testsuite through pytest fails, as the function
> test_data_path() is recognized as a test function. Its execution fails
> as pytest tries to resolve the 'path' argument as a fixture which does
> not exist.
>
> Rename the function, so the helper function is not incorrectly
> recognized as a test function.
>
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
> ---
Thanks -- I'd never tried pytest, but it's working with this series.
Although, it's worth noting that we add another call to
test_data_path() in "kunit: tool: Add test for nested test result
reporting", which conflicts here.
Reviewed-by: David Gow <davidgow@google.com>
Cheers,
-- David
> tools/testing/kunit/kunit_tool_test.py | 54 +++++++++++++++++-----------------
> 1 file changed, 27 insertions(+), 27 deletions(-)
>
> diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py
> index bbba921e0eac..fd7ca89596c0 100755
> --- a/tools/testing/kunit/kunit_tool_test.py
> +++ b/tools/testing/kunit/kunit_tool_test.py
> @@ -36,7 +36,7 @@ def setUpModule():
> def tearDownModule():
> shutil.rmtree(test_tmpdir)
>
> -def test_data_path(path):
> +def _test_data_path(path):
> return os.path.join(abs_test_data_dir, path)
>
> class KconfigTest(unittest.TestCase):
> @@ -52,7 +52,7 @@ class KconfigTest(unittest.TestCase):
> self.assertFalse(kconfig1.is_subset_of(kconfig0))
>
> def test_read_from_file(self):
> - kconfig_path = test_data_path('test_read_from_file.kconfig')
> + kconfig_path = _test_data_path('test_read_from_file.kconfig')
>
> kconfig = kunit_config.parse_file(kconfig_path)
>
> @@ -98,7 +98,7 @@ class KUnitParserTest(unittest.TestCase):
> raise AssertionError(f'"{needle}" not found in {list(backup)}!')
>
> def test_output_isolated_correctly(self):
> - log_path = test_data_path('test_output_isolated_correctly.log')
> + log_path = _test_data_path('test_output_isolated_correctly.log')
> with open(log_path) as file:
> result = kunit_parser.extract_tap_lines(file.readlines())
> self.assertContains('TAP version 14', result)
> @@ -109,7 +109,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertContains('ok 1 - example', result)
>
> def test_output_with_prefix_isolated_correctly(self):
> - log_path = test_data_path('test_pound_sign.log')
> + log_path = _test_data_path('test_pound_sign.log')
> with open(log_path) as file:
> result = kunit_parser.extract_tap_lines(file.readlines())
> self.assertContains('TAP version 14', result)
> @@ -138,35 +138,35 @@ class KUnitParserTest(unittest.TestCase):
> self.assertContains('ok 3 - string-stream-test', result)
>
> def test_parse_successful_test_log(self):
> - all_passed_log = test_data_path('test_is_test_passed-all_passed.log')
> + all_passed_log = _test_data_path('test_is_test_passed-all_passed.log')
> with open(all_passed_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> self.assertEqual(result.counts.errors, 0)
>
> def test_parse_successful_nested_tests_log(self):
> - all_passed_log = test_data_path('test_is_test_passed-all_passed_nested.log')
> + all_passed_log = _test_data_path('test_is_test_passed-all_passed_nested.log')
> with open(all_passed_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> self.assertEqual(result.counts.errors, 0)
>
> def test_kselftest_nested(self):
> - kselftest_log = test_data_path('test_is_test_passed-kselftest.log')
> + kselftest_log = _test_data_path('test_is_test_passed-kselftest.log')
> with open(kselftest_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> self.assertEqual(result.counts.errors, 0)
>
> def test_parse_failed_test_log(self):
> - failed_log = test_data_path('test_is_test_passed-failure.log')
> + failed_log = _test_data_path('test_is_test_passed-failure.log')
> with open(failed_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.FAILURE, result.status)
> self.assertEqual(result.counts.errors, 0)
>
> def test_no_header(self):
> - empty_log = test_data_path('test_is_test_passed-no_tests_run_no_header.log')
> + empty_log = _test_data_path('test_is_test_passed-no_tests_run_no_header.log')
> with open(empty_log) as file:
> result = kunit_parser.parse_run_tests(
> kunit_parser.extract_tap_lines(file.readlines()), stdout)
> @@ -175,7 +175,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts.errors, 1)
>
> def test_missing_test_plan(self):
> - missing_plan_log = test_data_path('test_is_test_passed-'
> + missing_plan_log = _test_data_path('test_is_test_passed-'
> 'missing_plan.log')
> with open(missing_plan_log) as file:
> result = kunit_parser.parse_run_tests(
> @@ -186,7 +186,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
>
> def test_no_tests(self):
> - header_log = test_data_path('test_is_test_passed-no_tests_run_with_header.log')
> + header_log = _test_data_path('test_is_test_passed-no_tests_run_with_header.log')
> with open(header_log) as file:
> result = kunit_parser.parse_run_tests(
> kunit_parser.extract_tap_lines(file.readlines()), stdout)
> @@ -195,7 +195,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts.errors, 1)
>
> def test_no_tests_no_plan(self):
> - no_plan_log = test_data_path('test_is_test_passed-no_tests_no_plan.log')
> + no_plan_log = _test_data_path('test_is_test_passed-no_tests_no_plan.log')
> with open(no_plan_log) as file:
> result = kunit_parser.parse_run_tests(
> kunit_parser.extract_tap_lines(file.readlines()), stdout)
> @@ -207,7 +207,7 @@ class KUnitParserTest(unittest.TestCase):
>
>
> def test_no_kunit_output(self):
> - crash_log = test_data_path('test_insufficient_memory.log')
> + crash_log = _test_data_path('test_insufficient_memory.log')
> print_mock = mock.patch('kunit_printer.Printer.print').start()
> with open(crash_log) as file:
> result = kunit_parser.parse_run_tests(
> @@ -218,7 +218,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts.errors, 1)
>
> def test_skipped_test(self):
> - skipped_log = test_data_path('test_skip_tests.log')
> + skipped_log = _test_data_path('test_skip_tests.log')
> with open(skipped_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
>
> @@ -227,7 +227,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts, kunit_parser.TestCounts(passed=4, skipped=1))
>
> def test_skipped_all_tests(self):
> - skipped_log = test_data_path('test_skip_all_tests.log')
> + skipped_log = _test_data_path('test_skip_all_tests.log')
> with open(skipped_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
>
> @@ -235,7 +235,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts, kunit_parser.TestCounts(skipped=5))
>
> def test_ignores_hyphen(self):
> - hyphen_log = test_data_path('test_strip_hyphen.log')
> + hyphen_log = _test_data_path('test_strip_hyphen.log')
> with open(hyphen_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
>
> @@ -249,7 +249,7 @@ class KUnitParserTest(unittest.TestCase):
> result.subtests[1].name)
>
> def test_ignores_prefix_printk_time(self):
> - prefix_log = test_data_path('test_config_printk_time.log')
> + prefix_log = _test_data_path('test_config_printk_time.log')
> with open(prefix_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> @@ -257,7 +257,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts.errors, 0)
>
> def test_ignores_multiple_prefixes(self):
> - prefix_log = test_data_path('test_multiple_prefixes.log')
> + prefix_log = _test_data_path('test_multiple_prefixes.log')
> with open(prefix_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> @@ -265,7 +265,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts.errors, 0)
>
> 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')
> with open(mixed_prefix_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> @@ -273,7 +273,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts.errors, 0)
>
> def test_prefix_poundsign(self):
> - pound_log = test_data_path('test_pound_sign.log')
> + pound_log = _test_data_path('test_pound_sign.log')
> with open(pound_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> @@ -281,7 +281,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual(result.counts.errors, 0)
>
> 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')
> with open(panic_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.TEST_CRASHED, result.status)
> @@ -289,7 +289,7 @@ class KUnitParserTest(unittest.TestCase):
> self.assertGreaterEqual(result.counts.errors, 1)
>
> 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')
> with open(pound_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(kunit_parser.TestStatus.SUCCESS, result.status)
> @@ -318,7 +318,7 @@ class KUnitParserTest(unittest.TestCase):
> 'Failures: all_failed_suite, some_failed_suite.test2')
>
> def test_ktap_format(self):
> - ktap_log = test_data_path('test_parse_ktap_output.log')
> + ktap_log = _test_data_path('test_parse_ktap_output.log')
> with open(ktap_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.assertEqual(result.counts, kunit_parser.TestCounts(passed=3))
> @@ -327,13 +327,13 @@ class KUnitParserTest(unittest.TestCase):
> self.assertEqual('case_2', result.subtests[0].subtests[1].name)
>
> def test_parse_subtest_header(self):
> - ktap_log = test_data_path('test_parse_subtest_header.log')
> + ktap_log = _test_data_path('test_parse_subtest_header.log')
> with open(ktap_log) as file:
> kunit_parser.parse_run_tests(file.readlines(), stdout)
> self.print_mock.assert_any_call(StrContains('suite (1 subtest)'))
>
> def test_parse_attributes(self):
> - ktap_log = test_data_path('test_parse_attributes.log')
> + ktap_log = _test_data_path('test_parse_attributes.log')
> with open(ktap_log) as file:
> result = kunit_parser.parse_run_tests(file.readlines(), stdout)
>
> @@ -555,7 +555,7 @@ class KUnitJsonTest(unittest.TestCase):
> self.addCleanup(mock.patch.stopall)
>
> def _json_for(self, log_file):
> - 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, stdout)
> json_obj = kunit_json.get_json_result(
> test=test_result,
> @@ -596,7 +596,7 @@ class StrContains(str):
>
> class KUnitMainTest(unittest.TestCase):
> def setUp(self):
> - path = test_data_path('test_is_test_passed-all_passed.log')
> + path = _test_data_path('test_is_test_passed-all_passed.log')
> with open(path) as file:
> all_passed_log = file.readlines()
>
>
> --
> 2.52.0
>
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 5281 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] kunit: tool: test: Don't rely on implicit working directory change
2025-12-30 12:56 ` [PATCH 2/2] kunit: tool: test: Don't rely on implicit working directory change Thomas Weißschuh
@ 2026-01-05 8:56 ` David Gow
0 siblings, 0 replies; 5+ messages in thread
From: David Gow @ 2026-01-05 8:56 UTC (permalink / raw)
To: Thomas Weißschuh
Cc: Brendan Higgins, Rae Moar, linux-kselftest, kunit-dev,
linux-kernel
[-- Attachment #1: Type: text/plain, Size: 2405 bytes --]
On Tue, 30 Dec 2025 at 20:56, Thomas Weißschuh
<thomas.weissschuh@linutronix.de> wrote:
>
> If no kunitconfig_paths are passed to LinuxSourceTree() it falls back to
> DEFAULT_KUNITCONFIG_PATH. This resolution only works when the current
> working directory is the root of the source tree. This works by chance
> when running the full testsuite through the default unittest runner, as
> some tests will change the current working directory as a side-effect of
> 'kunit.main()'. When running a single testcase or using pytest, which
> resets the working directory for each test, this assumption breaks.
>
> Explicitly specify an empty kunitconfig for the affected tests.
>
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
> ---
Reviewed-by: David Gow <davidgow@google.com>
Cheers,
-- David
> tools/testing/kunit/kunit_tool_test.py | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py
> index fd7ca89596c0..584275ce6ba6 100755
> --- a/tools/testing/kunit/kunit_tool_test.py
> +++ b/tools/testing/kunit/kunit_tool_test.py
> @@ -466,7 +466,8 @@ class LinuxSourceTreeTest(unittest.TestCase):
> want_kconfig = kunit_config.Kconfig()
> want_kconfig.add_entry('NOT_REAL', 'y')
>
> - tree = kunit_kernel.LinuxSourceTree('', kconfig_add=['CONFIG_NOT_REAL=y'])
> + tree = kunit_kernel.LinuxSourceTree('', kunitconfig_paths=[os.devnull],
> + kconfig_add=['CONFIG_NOT_REAL=y'])
> self.assertTrue(want_kconfig.is_subset_of(tree._kconfig), msg=tree._kconfig)
>
> def test_invalid_arch(self):
> @@ -478,7 +479,7 @@ class LinuxSourceTreeTest(unittest.TestCase):
> return subprocess.Popen(['echo "hi\nbye"'], shell=True, text=True, stdout=subprocess.PIPE)
>
> with tempfile.TemporaryDirectory('') as build_dir:
> - tree = kunit_kernel.LinuxSourceTree(build_dir)
> + tree = kunit_kernel.LinuxSourceTree(build_dir, kunitconfig_paths=[os.devnull])
> mock.patch.object(tree._ops, 'start', side_effect=fake_start).start()
>
> with self.assertRaises(ValueError):
>
> --
> 2.52.0
>
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 5281 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-01-05 8:56 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-30 12:56 [PATCH 0/2] kunit: tool: test: Allow running with pytest Thomas Weißschuh
2025-12-30 12:56 ` [PATCH 1/2] kunit: tool: test: Rename test_data_path() to _test_data_path() Thomas Weißschuh
2026-01-05 8:56 ` David Gow
2025-12-30 12:56 ` [PATCH 2/2] kunit: tool: test: Don't rely on implicit working directory change Thomas Weißschuh
2026-01-05 8:56 ` David Gow
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox