linux_kselftest-kunit-6.12-rc1

This kunit update for Linux 6.12-rc1 consists of:
 
 -- a new int_pow test suite
 -- documentation update to clarify filename best practices
 -- kernel-doc fix for EXPORT_SYMBOL_IF_KUNIT
 -- change to build compile_commands.json automatically instead
    of requiring a manual build.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEPZKym/RZuOCGeA/kCwJExA0NQxwFAmbo3WEACgkQCwJExA0N
 Qxz1WxAAj+772NHxsJ4JnPqr/74doKnzKc1jM2V4g/F9Y+BT0tSKs1Cu5CyN9VsT
 wvxVPWqYltyhumVm/H6SaUGb0yZ7CzJi/5FuT3p3QFUDidMSu1h9KnlLi79q3cDI
 VuFKE8K4DDP0GfyFMpbSPZOGfYQp24FybhxRxreY+7q6uRVAnPh33Q1/Bonv6K6q
 5329a0z9wWySgisa93ABmQNpF4UJSYunR2bsdUzZqHgyrTXSyK66fcmVKwbBUaIT
 o16P1LBjDcIbfwswFb+xUmWD1IPGk7ulirEq8n69tErI6zKbkv1rojXHsoXuvOEN
 a4i+sNyR+a7NVI1h/T8F25pSbegkL0XQs7cmehATqpInmEZNDeGR8PkaGZNXXrFy
 kG/z7LlWh8zQUBrTsqOLU/iz4sRVrsPCuLIUzo8MiKpAskmj/7fqw5Cab9jmL5V3
 6OLAfCQDrfcH7fM9V5U6Ury2dkcovFuw+ZhFcBuLnspB5z0Cj7Yqz6aDZdJ97qyR
 PfZuyBU2ouykhpJ4P/sRJC3Gq1t0b+PoDq3qNdCqz4ETld1jaiDz0e75ypquJWyB
 QdVMNJF6W7Nwnmpzp4GY9QZ6dtwOKGZyuvW5J0eleWKiD4gjHZaoupIzqT24fgYi
 vdscbcOxMMU3/b9F4qDlgsLSPCLVF4HIXTAK2UdiznLdaxYVHQ0=
 =rmqh
 -----END PGP SIGNATURE-----

Merge tag 'linux_kselftest-kunit-6.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull kunit updates from Shuah Khan:

 - a new int_pow test suite

 - documentation update to clarify filename best practices

 - kernel-doc fix for EXPORT_SYMBOL_IF_KUNIT

 - change to build compile_commands.json automatically instead of
   requiring a manual build

* tag 'linux_kselftest-kunit-6.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  lib/math: Add int_pow test suite
  kunit: tool: Build compile_commands.json
  kunit: Fix kernel-doc for EXPORT_SYMBOL_IF_KUNIT
  Documentation: KUnit: Update filename best practices
This commit is contained in:
Linus Torvalds 2024-09-17 16:52:24 +02:00
commit 194fcd20eb
7 changed files with 95 additions and 10 deletions

View File

@ -188,15 +188,26 @@ For example, a Kconfig entry might look like:
Test File and Module Names Test File and Module Names
========================== ==========================
KUnit tests can often be compiled as a module. These modules should be named KUnit tests are often compiled as a separate module. To avoid conflicting
after the test suite, followed by ``_test``. If this is likely to conflict with with regular modules, KUnit modules should be named after the test suite,
non-KUnit tests, the suffix ``_kunit`` can also be used. followed by ``_kunit`` (e.g. if "foobar" is the core module, then
"foobar_kunit" is the KUnit test module).
The easiest way of achieving this is to name the file containing the test suite Test source files, whether compiled as a separate module or an
``<suite>_test.c`` (or, as above, ``<suite>_kunit.c``). This file should be ``#include`` in another source file, are best kept in a ``tests/``
placed next to the code under test. subdirectory to not conflict with other source files (e.g. for
tab-completion).
Note that the ``_test`` suffix has also been used in some existing
tests. The ``_kunit`` suffix is preferred, as it makes the distinction
between KUnit and non-KUnit tests clearer.
So for the common case, name the file containing the test suite
``tests/<suite>_kunit.c``. The ``tests`` directory should be placed at
the same level as the code under test. For example, tests for
``lib/string.c`` live in ``lib/tests/string_kunit.c``.
If the suite name contains some or all of the name of the test's parent If the suite name contains some or all of the name of the test's parent
directory, it may make sense to modify the source filename to reduce redundancy. directory, it may make sense to modify the source filename to reduce
For example, a ``foo_firmware`` suite could be in the ``foo/firmware_test.c`` redundancy. For example, a ``foo_firmware`` suite could be in the
file. ``foo/tests/firmware_kunit.c`` file.

View File

@ -22,6 +22,7 @@
* EXPORTED_FOR_KUNIT_TESTING namespace only if CONFIG_KUNIT is * EXPORTED_FOR_KUNIT_TESTING namespace only if CONFIG_KUNIT is
* enabled. Must use MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING) * enabled. Must use MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING)
* in test file in order to use symbols. * in test file in order to use symbols.
* @symbol: the symbol identifier to export
*/ */
#define EXPORT_SYMBOL_IF_KUNIT(symbol) EXPORT_SYMBOL_NS(symbol, \ #define EXPORT_SYMBOL_IF_KUNIT(symbol) EXPORT_SYMBOL_NS(symbol, \
EXPORTED_FOR_KUNIT_TESTING) EXPORTED_FOR_KUNIT_TESTING)

View File

@ -3059,3 +3059,19 @@ config RUST_KERNEL_DOCTESTS
endmenu # "Rust" endmenu # "Rust"
endmenu # Kernel hacking endmenu # Kernel hacking
config INT_POW_TEST
tristate "Integer exponentiation (int_pow) test" if !KUNIT_ALL_TESTS
depends on KUNIT
default KUNIT_ALL_TESTS
help
This option enables the KUnit test suite for the int_pow function,
which performs integer exponentiation. The test suite is designed to
verify that the implementation of int_pow correctly computes the power
of a given base raised to a given exponent.
Enabling this option will include tests that check various scenarios
and edge cases to ensure the accuracy and reliability of the exponentiation
function.
If unsure, say N

View File

@ -5,5 +5,6 @@ obj-$(CONFIG_CORDIC) += cordic.o
obj-$(CONFIG_PRIME_NUMBERS) += prime_numbers.o obj-$(CONFIG_PRIME_NUMBERS) += prime_numbers.o
obj-$(CONFIG_RATIONAL) += rational.o obj-$(CONFIG_RATIONAL) += rational.o
obj-$(CONFIG_INT_POW_TEST) += tests/int_pow_kunit.o
obj-$(CONFIG_TEST_DIV64) += test_div64.o obj-$(CONFIG_TEST_DIV64) += test_div64.o
obj-$(CONFIG_RATIONAL_KUNIT_TEST) += rational-test.o obj-$(CONFIG_RATIONAL_KUNIT_TEST) += rational-test.o

3
lib/math/tests/Makefile Normal file
View File

@ -0,0 +1,3 @@
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_INT_POW_TEST) += int_pow_kunit.o

View File

@ -0,0 +1,52 @@
// SPDX-License-Identifier: GPL-2.0-only
#include <kunit/test.h>
#include <linux/math.h>
struct test_case_params {
u64 base;
unsigned int exponent;
u64 expected_result;
const char *name;
};
static const struct test_case_params params[] = {
{ 64, 0, 1, "Power of zero" },
{ 64, 1, 64, "Power of one"},
{ 0, 5, 0, "Base zero" },
{ 1, 64, 1, "Base one" },
{ 2, 2, 4, "Two squared"},
{ 2, 3, 8, "Two cubed"},
{ 5, 5, 3125, "Five raised to the fifth power" },
{ U64_MAX, 1, U64_MAX, "Max base" },
{ 2, 63, 9223372036854775808ULL, "Large result"},
};
static void get_desc(const struct test_case_params *tc, char *desc)
{
strscpy(desc, tc->name, KUNIT_PARAM_DESC_SIZE);
}
KUNIT_ARRAY_PARAM(int_pow, params, get_desc);
static void int_pow_test(struct kunit *test)
{
const struct test_case_params *tc = (const struct test_case_params *)test->param_value;
KUNIT_EXPECT_EQ(test, tc->expected_result, int_pow(tc->base, tc->exponent));
}
static struct kunit_case math_int_pow_test_cases[] = {
KUNIT_CASE_PARAM(int_pow_test, int_pow_gen_params),
{}
};
static struct kunit_suite int_pow_test_suite = {
.name = "math-int_pow",
.test_cases = math_int_pow_test_cases,
};
kunit_test_suites(&int_pow_test_suite);
MODULE_DESCRIPTION("math.int_pow KUnit test suite");
MODULE_LICENSE("GPL");

View File

@ -72,7 +72,8 @@ class LinuxSourceTreeOperations:
raise ConfigError(e.output.decode()) raise ConfigError(e.output.decode())
def make(self, jobs: int, build_dir: str, make_options: Optional[List[str]]) -> None: def make(self, jobs: int, build_dir: str, make_options: Optional[List[str]]) -> None:
command = ['make', 'ARCH=' + self._linux_arch, 'O=' + build_dir, '--jobs=' + str(jobs)] command = ['make', 'all', 'compile_commands.json', 'ARCH=' + self._linux_arch,
'O=' + build_dir, '--jobs=' + str(jobs)]
if make_options: if make_options:
command.extend(make_options) command.extend(make_options)
if self._cross_compile: if self._cross_compile: