blob: efba7fed580c0cfafcb77557071c7933329734d7 [file] [log] [blame]
=============
Release Notes
=============
This page briefly summarizes the KUnit changes in each Linux release.
For more specific documentation on KUnit features, see the in-kernel
documentation: https://kernel.org/doc/html/latest/dev-tools/kunit.
.. _v5.5:
5.5
===
- KUnit introduced, including all the basic functionality.
- ``kunitconfig`` was renamed to ``.kunitconfig`` later in 5.5 (`commit
<https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=14ee5cfd4512ee3d1e0047d8751450dcc6544070>`__)
.. _v5.6:
5.6
===
- KUnit tests can be built as modules, `docs
<https://www.kernel.org/doc/html/latest/dev-tools/kunit/running_tips.html#running-tests-as-modules>`__
.. _v5.7:
5.7
===
- kunit.py switched to using ``.kunit/`` as the default build dir (and
``.kunitconfig`` => ``.kunit/.kunitconfig``).
- ``CONFIG_KUNIT_DEBUGFS`` to expose per-suite test results in
``/sys/kernel/debug/kunit/<suite>/results``, `docs
<https://www.kernel.org/doc/html/latest/dev-tools/kunit/running_tips.html#retrieving-per-suite-results>`__
.. _v5.8:
5.8
===
- ``kunit.py`` now supports separate ``config/build/exec/parse`` commands in
addition to ``run``.
- You can use these if you don't want to let ``kunit.py run`` do everything
for you, e.g. if you want to run manually but parse the results using
``kunit.py``.
- ``CONFIG_KUNIT_ALL_TESTS`` introduced
- This is just a convention. New tests should use it like so:
.. code-block:: none
config FOO_KUNIT_TEST
tristate "KUnit test for foo" if !KUNIT_ALL_TESTS
depends on KUNIT
default KUNIT_ALL_TESTS
help
This builds unit tests for foo.
See `the upstream documentation
<https://www.kernel.org/doc/html/latest/dev-tools/kunit/style.html#test-kconfig-entries>`__
for the authoritative source on how to write Kconfig entries.
.. _v5.9:
5.9
===
- Named resources: tests can store and retrieve data via string keys.
- This is a power feature intended to be a cleaner alternative to using
global variables in tests.
- See `test_kasan.c
<https://elixir.bootlin.com/linux/latest/source/lib/test_kasan.c>`__ for an
example that uses ``"kasan_data"``.
.. _v5.10:
5.10
====
- KASAN violations cause the current KUnit test case to be marked FAILED.
- Note: KASAN doesn't currently work on UML.
.. _v5.11:
5.11
====
- Parameterized testing: see the `docs
<https://www.kernel.org/doc/html/latest/dev-tools/kunit/usage.html#parameterized-testing>`__.
.. _v5.12:
5.12
====
- You can pass in a path to a kunitconfig file instead of using
``.kunit/.kunitconfig``, e.g.
.. code-block:: shell
$ ./tools/testing/kunit/kunit.py run --kunitconfig=fs/ext4/.kunitconfig
- You can tell ``kunit.py`` to run a subset of built suites by passing in a
glob argument, e.g.
.. code-block:: shell
# Only run "list" suites
$ ./tools/testing/kunit/kunit.py run '*list*'
.. _v5.13:
5.13
====
- Can call ``kunit_fail_current_test()`` from anywhere to fail the current KUnit test (e.g. if an invariant is broken, a UBSAN violation is detected, etc.)
- You can pass a directory ``--kunitconfig`` and it'll implicitly append
``.kunitconfig``, e.g. ``kunit.py run --kunitconfig=lib/kunit``.
.. _v5.14:
5.14
====
- ``kunit.py`` can run tests on non-UML architectures (using QEMU), `docs
<https://www.kernel.org/doc/html/latest/dev-tools/kunit/kunit-tool.html#running-tests-on-qemu>`__
- It's now possible to generate code coverage reports when using UML, `docs
<https://www.kernel.org/doc/html/latest/dev-tools/kunit/running_tips.html#generating-code-coverage-reports-under-uml>`__
- Tests can call ``kunit_skip()`` to bail out and mark a test as "SKIPPED"
instead of "PASSED" or "FAILED"
.. _v5.15:
5.15
====
- UBSAN violations cause the current KUnit test case to be marked FAILED.
- Can pass kernel commandline parameters from ``kunit.py`` via
``--kernel_args``
- KUnit prints a summary per suite of how many test cases passed/failed to
dmesg, e.g.
.. code-block:: shell
# property-entry: pass:7 fail:0 skip:0 total:7
.. _v5.16:
5.16
====
- You can filter on test names now in addition to suite names, e.g.
.. code-block:: shell
# Only run tests that contain "foo"
$ ./tools/testing/kunit/kunit.py run '*.*foo*'
# Only run tests in "mysuite" that contain "foo"
$ ./tools/testing/kunit/kunit.py run 'mysuite.*foo*'
- You can ask ``kunit.py`` to run each suite/test by itself. This can be useful
to track down issues due to non-hermetic tests
.. code-block:: shell
$ ./tools/testing/kunit/kunit.py run --run_isolated=suite
$ ./tools/testing/kunit/kunit.py run --run_isolated=test
- ``kunit.py``'s parsing logic was largely rewritten, so the output looks
slightly different
- Parsed output is also now mostly printed out in real time.
- ``kunit.py`` with ``--raw_output`` will print output in real time.
- In-kernel documentation has been significantly revamped.
.. _v5.17:
5.17
====
- Print out parsed test results in real time.
- Allow tweaking Kconfig options from command-line, e.g.
.. code-block:: shell
$ ./tools/testing/kunit/kunit.py run --kconfig_add=MY_CONFIG=y
- Reconfigure kunit kernel when the used ``kunitconfig`` has changed
- Before, if you removed an entry from ``.kunitconfig``, ``kunit.py`` would
not reconfigure, so your edit would have no effect.
- This now also works if you remove a ``--kconfig_add`` flag.
- Print out parameters as sub-test cases (both in raw and parsed output), e.g.:
.. code-block::
[12:37:14] =============== ext4_inode_test (1 subtest) ================
[12:37:14] ======= inode_test_xtimestamp_decoding (16 subtests) =======
[12:37:14] [PASSED] 1901-12-13 Lower bound of 32bit < 0 timestamp, no extra bits
...
[12:37:14] [PASSED] 2446-05-10 Upper bound of 32bit >=0 timestamp. All extra sec bits on
[12:37:14] ========= [PASSED] inode_test_xtimestamp_decoding ==========
[12:37:14] ================= [PASSED] ext4_inode_test =================
[12:37:14] ============================================================
.. _v5.18:
5.18
====
- Drastically decrease stack usage of ``KUNIT_EXPECT_`` macros.
- Before, we largely relied on the compiler to optimize away some internal
structs, but that didn't always work.
- Now on UML (x86_64), ``KUNIT_EXPECT_EQ()`` uses 32 bytes instead of 88.
.. _v5.19:
5.19
====
- Add support for suite-level init/exit functions.
- ``suite_init``/``suite_exit`` are like ``init`` and ``exit`` instead of once per test case.
- Add ``KUNIT_EXPECT_NULL()``/``KUNIT_EXPECT_NOT_NULL()`` macros.
- Split out KUnit resource API from ``<kunit/test.h>`` into ``<kunit/resource.h>``.
- Including ``<kunit/test.h>`` will still automatically ``#include <kunit/resource.h>`` for now.
- ``kunit.py`` no longer colorizes output when stdout is not a tty.
- Add a manually curated ``tools/testing/kunit/configs/all_tests_uml.config``
- This attempts to enable as many tests as possible on UML.
- Change quoting requirements for qemu_config files (`commit
<https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3f0a50f345f78183f6e9b39c2f45ca5dcaa511ca>`__)
- E.g. instead of ``['-m 256']``, do ``['-m', '256']``
.. _v6.0:
6.0
===
- Overhaul support for building tests as modules
- Before, it wouldn't work in modules that already had their own
``module_init``/``module_exit``. Now this restriction is gone.
- Add ``--qemu_args`` flag, e.g. use ``--qemu_args='-m 2048'`` to give tests more RAM.
- Allow ``--kunitconfig`` to be repeated.
- This will just concatenante the contents together.
- One use case for this is appending the options for code coverage:
.. code-block:: shell
$ ./tools/testing/kunit/kunit.py run --kunitconfig=my/dir --kunitconfig=tools/testing/kunit/configs/coverage_uml.config
- Taint the kernel if any KUnit tests run.
- Add a new ``TAINT_TEST`` flag, shows up as ``'N'``.
- Add support for KASAN to run on 64-bit UML.
- By default, enable PCI support under UML.
.. _v6.1:
6.1
===
- ``kunit.py run --alltests`` now works.
- Renamed ``all_tests_uml.config`` (added in :ref:`v5.19`) to ``all_tests.config``.
- Changed the ``--alltests`` flag to use this manually curated file instead of
trying to get ``allyesconfig`` to work.
- Removed Virtio and PCI UML specific options from ``all_tests_uml.config``.
- ``Documentation/`` updates and fixes.
- Further reduction in the stack consumption of ``KUNIT_EXPECT_`` macros.
- For context, see :ref:`v5.18`.
- On UML, now ``KUNIT_FAIL()`` uses 0 bytes (was 8), and ``KUNIT_EXPECT_EQ()``
uses 24 (was 32).
- In edge cases, ``kunit_kfree()`` matches ``kfree()``:
- ``kunit_kfree(NULL)`` is a no-op.
- ``kunit_kfree(invalid_ptr)`` will no longer crash, but it will now fail the test.
- Introduce new ``kunit.enable`` kernel command-line argument.
- This is a niche feature. If you don't want to run tests, prefer setting
``CONFIG_KUNIT=n``.
- However, if you need to compile KUnit, you can use this to forcibly prevent
tests from running.
- You can set the default value of the option via ``CONFIG_KUNIT_DEFAULT_ENABLED``.
.. _v6.2:
6.2
===
- Added new ``KUNIT_EXPECT_MEMEQ(test, a, b, size)`` macro for comparing memory blocks.
- This is an alternative to ``KUNIT_EXPECT_EQ(test, memcmp(a, b, size), 0)``.
- On failure, KUnit will print out the bytes and highlight where the regions differ.
- Failure logs are available in decimal and hexadecimal output.
- Use a static key to check if tests are currently running.
- This reduces the performance overhead of `kunit_get_current_test()` and
`kunit_fail_current_test()` when no test is running.
- For more details, see `kunit: Provide a static key to check if KUnit is actively running tests <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=908d0c177bbc7c34ab9129c6f2bcd87487115632>`__.
- Make KUnit output and the kunit.py parser compliant with KTAP version 1 specification.
- In KUnit output, subtests are now indicated using "KTAP version 1" headers.
- Added two macros, `VISIBLE_IF_KUNIT` and `EXPORT_SYMBOL_IF_KUNIT`, that let
tests to conditionally expose static symbols.
- For an example of how to use these macros, see `apparmor: test: make static symbols visible during kunit testing <https://git.kernel.org/pub/scm/ linux/kernel/git/torvalds/linux.git/commit/?id=b11e51dd70947107fa4076c6286dce301671afc1>`__.
- Made the following KUnit documentation changes:
- Updated the "architecture.rst" page for style and grammatical issues.
- Made "usage.rst" a superset of "tips.rst" and removed "tips.rst" page.
- Reworded assertion description.
- Fix "How Do I Use This" / "Next Steps" section.
- Updated the requirements for test result description in KTAP specification.
.. _v6.3:
6.3
===
- Added "hooks" to call into KUnit when it's built as a module.
- These allow some KUnit features to be used in built-in code, or in other
modules, without introducing a hard dependency on KUnit.
- Introduced a "static_stub" feature to add redirection support for KUnit tests.
Any function that wants to be intercepted adds a call to a macro which checks
if a test has redirected calls to it, and then calls the corresponding replacement.
.. _v6.4:
6.4
===
- kunit.py now supports building / running tests via QEMU on the m68k and SuperH (sh)
architectures.
- Several fixes to debugfs log support, particularly with parameterized tests.
- The default log size has been increased to 2048 bytes.
.. _v6.5:
6.5
===
- Added a new 'deferred actions' API, based on the devm\_/devres APIs, to call a function
automatically on test exit. This should simplify resource management an cleanup.
- See: https://docs.kernel.org/dev-tools/kunit/usage.html#registering-cleanup-actions
- Test cleanup is now always run from a KUnit-managed test thread.
- Previously, if a test aborted early, its cleanup (deferred actions,
resources, and test / suite exit functions) would be run from the main
KUnit executor thread.
- This could cause problems if an assertion or crash occurred during cleanup.
- Now, if the original test thred exits, a new cleanup thread is spawned.
- Improved documentation and examples for test / suite init()/exit() functions.
.. _v6.6:
6.6
===
- Tests and suites can now have 'attributes', which can be filtered upon.
- 'speed' denotes the expected runtime of a test: tests which are expected to
take > 1 second to execute can be marked slow with ``KUNIT_CASE_SLOW()``.
- 'module' lists the name of the module containing the test.
- See: https://docs.kernel.org/dev-tools/kunit/running_tips.html#test-attributes-and-filtering
- Rust 'doctests' are now automatically converted into and run as KUnit tests.
- Additional architectural features are supported in the arm64 QEMU target.
.. _v6.7:
6.7
===
- Test logs are no longer limited to 2KiB in debugfs. The log will now grow as required.
- KUnit will now warn if a test takes longer than 2 seconds to run, but is not marked as slow.