Commit 194fcd20 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'linux_kselftest-kunit-6.12-rc1' of...

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
parents 32b72deb 7fcc9b53
...@@ -188,15 +188,26 @@ For example, a Kconfig entry might look like: ...@@ -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.
...@@ -22,6 +22,7 @@ ...@@ -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)
......
...@@ -3059,3 +3059,19 @@ config RUST_KERNEL_DOCTESTS ...@@ -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
...@@ -5,5 +5,6 @@ obj-$(CONFIG_CORDIC) += cordic.o ...@@ -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
# SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_INT_POW_TEST) += int_pow_kunit.o
// 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");
...@@ -72,7 +72,8 @@ class LinuxSourceTreeOperations: ...@@ -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:
......
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