Le 30/07/2026 à 12:19 AM, [email protected] a écrit :
> From: Mohammad Abu-Khader <[email protected]>
> 
> `_list_tests()` runs the kernel to list tests, strips printk timestamp
> lines via `extract_tap_lines()`, then drops the dummy TAP header from
> the cleaned `lines`.  However the subsequent regex filter mistakenly
> operates on the original `output` instead of the cleaned `lines`.  When
> the kernel output includes timestamp prefixes (common with UML or slower
> setups), e.g.:
> 
>   [    0.100000] suite.test1
>   [    0.100000] suite.test2
> 
> the anchored regex `^[^\s.]+\.[^\s.]+$` rejects them and `--list_tests`
> returns an empty list.
> 
> Filter `lines` instead of `output`, matching the behavior of the
> adjacent `_list_tests_attr()` which already returns the cleaned list.
> 
> Add a regression test with timestamp-prefixed input to verify the fix.
> 
> Fixes: 723c8258c8fe ("kunit: tool: Add command line interface to filter and 
> report attributes")
> ---

Thanks: nice catch. I rarely run with CONFIG_PRINTK_TIME=y, so didn't
notice.

Reviewed-by: David Gow <[email protected]>

Cheers,
-- David

>  tools/testing/kunit/kunit.py           |  2 +-
>  tools/testing/kunit/kunit_tool_test.py | 12 ++++++++++++
>  2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/tools/testing/kunit/kunit.py b/tools/testing/kunit/kunit.py
> index ac3f7159e67f..91d234ac3b57 100755
> --- a/tools/testing/kunit/kunit.py
> +++ b/tools/testing/kunit/kunit.py
> @@ -126,7 +126,7 @@ def _list_tests(linux: kunit_kernel.LinuxSourceTree, 
> request: KunitExecRequest)
>       lines.pop()
>  
>       # Filter out any extraneous non-test output that might have gotten 
> mixed in.
> -     return [l for l in output if re.match(r'^[^\s.]+\.[^\s.]+$', l)]
> +     return [l for l in lines if re.match(r'^[^\s.]+\.[^\s.]+$', l)]
>  
>  def _list_tests_attr(linux: kunit_kernel.LinuxSourceTree, request: 
> KunitExecRequest) -> Iterable[str]:
>       args = ['kunit.action=list_attr']
> diff --git a/tools/testing/kunit/kunit_tool_test.py 
> b/tools/testing/kunit/kunit_tool_test.py
> index da88c3a1651d..85ae21754bdf 100755
> --- a/tools/testing/kunit/kunit_tool_test.py
> +++ b/tools/testing/kunit/kunit_tool_test.py
> @@ -979,6 +979,18 @@ class KUnitMainTest(unittest.TestCase):
>               self.linux_source_mock.run_kernel.assert_called_once_with(
>                       args=['kunit.action=list'], build_dir='.kunit', 
> filter_glob='suite*', filter='', filter_action=None, timeout=300)
>  
> +     def test_list_tests_with_prefix(self):
> +             want = ['suite.test1', 'suite.test2', 'suite2.test1']
> +             self.linux_source_mock.run_kernel.return_value = [
> +                     '[    0.100000] TAP version 14',
> +                     '[    0.200000] suite.test1',
> +                     '[    0.200000] suite.test2',
> +                     '[    0.300000] suite2.test1']
> +
> +             got = kunit._list_tests(self.linux_source_mock,
> +                                  kunit.KunitExecRequest(None, None, None, 
> False, False, '.kunit', 300, 'suite*', '', None, None, 'suite', False, False, 
> False))
> +             self.assertEqual(got, want)
> +
>       @mock.patch.object(kunit, '_list_tests')
>       def test_run_isolated_by_suite(self, mock_tests):
>               mock_tests.return_value = ['suite.test1', 'suite.test2', 
> 'suite2.test1']


Reply via email to