lib/Kconfig.debug | 14 +++++ lib/math/Makefile | 4 +- lib/math/prime_numbers.c | 76 ++++------------------------ lib/math/prime_numbers_private.h | 17 +++++++ lib/math/tests/Makefile | 1 + lib/math/tests/prime_numbers_kunit.c | 59 +++++++++++++++++++++ tools/testing/selftests/lib/config | 1 - tools/testing/selftests/lib/prime_numbers.sh | 4 -- 8 files changed, 102 insertions(+), 74 deletions(-)
This is a clear example of a unit test.
I tested this using:
$ tools/testing/kunit/kunit.py run --arch arm64 --make_options LLVM=1 math-prime_numbers
On success:
; [08:51:41] ============== math-prime_numbers (1 subtest) ==============
; [08:51:41] [PASSED] prime_numbers_test
; [08:51:41] =============== [PASSED] math-prime_numbers ================
; [08:51:41] ============================================================
; [08:51:41] Testing complete. Ran 1 tests: passed: 1
On failure:
; [08:50:19] ============== math-prime_numbers (1 subtest) ==============
; [08:50:19] # prime_numbers_test: ASSERTION FAILED at lib/math/tests/prime_numbers_kunit.c:28
; [08:50:19] Expected slow == fast, but
; [08:50:19] slow == 0 (0x0)
; [08:50:19] fast == 1 (0x1)
; [08:50:19] is-prime(2)
; [08:50:19] [FAILED] prime_numbers_test
; [08:50:19] # module: prime_numbers_kunit
; [08:50:19] # math-prime_numbers: primes.{last=61, .sz=64, .primes[]=...x28208a20a08a28ac} = 2-3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61
; [08:50:19] =============== [FAILED] math-prime_numbers ================
; [08:50:19] ============================================================
; [08:50:19] Testing complete. Ran 1 tests: failed: 1
Signed-off-by: Tamir Duberstein <tamird@gmail.com>
---
Changes in v3:
- Remove `selftest_max` again; snuck into v2.
- Restore `#include <linux/slab.h>`.
- Sending v3 early because kernel test robot is sad.
- Link to v2: https://lore.kernel.org/r/20250208-prime_numbers-kunit-convert-v2-0-863119447e04@gmail.com
Changes in v2:
- Keep all the details hidden in prime_numbers.c; expose `with_primes`
for debug logging in the test. (David Gow)
- Link to v1: https://lore.kernel.org/r/20250207-prime_numbers-kunit-convert-v1-0-6067f2b7c713@gmail.com
---
Tamir Duberstein (2):
lib/math: Hook up tests/Makefile
lib/prime_numbers: convert self-test to KUnit
lib/Kconfig.debug | 14 +++++
lib/math/Makefile | 4 +-
lib/math/prime_numbers.c | 76 ++++------------------------
lib/math/prime_numbers_private.h | 17 +++++++
lib/math/tests/Makefile | 1 +
lib/math/tests/prime_numbers_kunit.c | 59 +++++++++++++++++++++
tools/testing/selftests/lib/config | 1 -
tools/testing/selftests/lib/prime_numbers.sh | 4 --
8 files changed, 102 insertions(+), 74 deletions(-)
---
base-commit: 2014c95afecee3e76ca4a56956a936e23283f05b
change-id: 20250207-prime_numbers-kunit-convert-71c9b3c1d1d4
Best regards,
--
Tamir Duberstein <tamird@gmail.com>
On Sat, 08 Feb 2025 17:52:28 -0500 Tamir Duberstein <tamird@gmail.com> wrote:
> This is a clear example of a unit test.
>
> I tested this using:
>
> $ tools/testing/kunit/kunit.py run --arch arm64 --make_options LLVM=1 math-prime_numbers
>
> On success:
> ; [08:51:41] ============== math-prime_numbers (1 subtest) ==============
> ; [08:51:41] [PASSED] prime_numbers_test
> ; [08:51:41] =============== [PASSED] math-prime_numbers ================
> ; [08:51:41] ============================================================
> ; [08:51:41] Testing complete. Ran 1 tests: passed: 1
>
> On failure:
> ; [08:50:19] ============== math-prime_numbers (1 subtest) ==============
> ; [08:50:19] # prime_numbers_test: ASSERTION FAILED at lib/math/tests/prime_numbers_kunit.c:28
> ; [08:50:19] Expected slow == fast, but
> ; [08:50:19] slow == 0 (0x0)
> ; [08:50:19] fast == 1 (0x1)
> ; [08:50:19] is-prime(2)
> ; [08:50:19] [FAILED] prime_numbers_test
> ; [08:50:19] # module: prime_numbers_kunit
> ; [08:50:19] # math-prime_numbers: primes.{last=61, .sz=64, .primes[]=...x28208a20a08a28ac} = 2-3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61
> ; [08:50:19] =============== [FAILED] math-prime_numbers ================
> ; [08:50:19] ============================================================
> ; [08:50:19] Testing complete. Ran 1 tests: failed: 1
>
I resolved this against "lib/math: add Kunit test suite for gcd()"
(https://lkml.kernel.org/r/20250203075400.3431330-1-eleanor15x@gmail.com)
in the obvious fashion then added this fixup:
From: Andrew Morton <akpm@linux-foundation.org>
Subject: lib-math-hook-up-tests-makefile-fix
Date: Sat Feb 8 03:33:59 PM PST 2025
don't link gcd_kunit.o twice
Cc: David Gow <davidgow@google.com>
Cc: Tamir Duberstein <tamird@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
lib/math/Makefile | 1 -
1 file changed, 1 deletion(-)
--- a/lib/math/Makefile~lib-math-hook-up-tests-makefile-fix
+++ a/lib/math/Makefile
@@ -8,5 +8,4 @@ obj-$(CONFIG_RATIONAL) += rational.o
obj-$(CONFIG_TEST_DIV64) += test_div64.o
obj-$(CONFIG_TEST_MULDIV64) += test_mul_u64_u64_div_u64.o
obj-$(CONFIG_RATIONAL_KUNIT_TEST) += rational-test.o
-obj-$(CONFIG_GCD_KUNIT_TEST) += tests/gcd_kunit.o
obj-y += tests/
_
and the x86_64 allmodconfig build failed thusly:
lib/math/tests/prime_numbers_kunit.c: In function 'prime_numbers_test':
lib/math/tests/prime_numbers_kunit.c:25:35: error: implicit declaration of function 'slow_is_prime_number'; did you mean 'is_prime_number'? [-Werror=implicit-function-declaration]
25 | const bool slow = slow_is_prime_number(x);
| ^~~~~~~~~~~~~~~~~~~~
| is_prime_number
So, please redo against mm.git's mm-everything branch or its
mm-nonmm-unstable branch and retest carefully.
On Sat, Feb 8, 2025 at 7:25 PM Andrew Morton <akpm@linux-foundation.org> wrote:
>
> On Sat, 08 Feb 2025 17:52:28 -0500 Tamir Duberstein <tamird@gmail.com> wrote:
>
> > This is a clear example of a unit test.
> >
> > I tested this using:
> >
> > $ tools/testing/kunit/kunit.py run --arch arm64 --make_options LLVM=1 math-prime_numbers
> >
> > On success:
> > ; [08:51:41] ============== math-prime_numbers (1 subtest) ==============
> > ; [08:51:41] [PASSED] prime_numbers_test
> > ; [08:51:41] =============== [PASSED] math-prime_numbers ================
> > ; [08:51:41] ============================================================
> > ; [08:51:41] Testing complete. Ran 1 tests: passed: 1
> >
> > On failure:
> > ; [08:50:19] ============== math-prime_numbers (1 subtest) ==============
> > ; [08:50:19] # prime_numbers_test: ASSERTION FAILED at lib/math/tests/prime_numbers_kunit.c:28
> > ; [08:50:19] Expected slow == fast, but
> > ; [08:50:19] slow == 0 (0x0)
> > ; [08:50:19] fast == 1 (0x1)
> > ; [08:50:19] is-prime(2)
> > ; [08:50:19] [FAILED] prime_numbers_test
> > ; [08:50:19] # module: prime_numbers_kunit
> > ; [08:50:19] # math-prime_numbers: primes.{last=61, .sz=64, .primes[]=...x28208a20a08a28ac} = 2-3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61
> > ; [08:50:19] =============== [FAILED] math-prime_numbers ================
> > ; [08:50:19] ============================================================
> > ; [08:50:19] Testing complete. Ran 1 tests: failed: 1
> >
>
> I resolved this against "lib/math: add Kunit test suite for gcd()"
> (https://lkml.kernel.org/r/20250203075400.3431330-1-eleanor15x@gmail.com)
> in the obvious fashion then added this fixup:
>
> From: Andrew Morton <akpm@linux-foundation.org>
> Subject: lib-math-hook-up-tests-makefile-fix
> Date: Sat Feb 8 03:33:59 PM PST 2025
>
> don't link gcd_kunit.o twice
>
> Cc: David Gow <davidgow@google.com>
> Cc: Tamir Duberstein <tamird@gmail.com>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
>
> lib/math/Makefile | 1 -
> 1 file changed, 1 deletion(-)
>
> --- a/lib/math/Makefile~lib-math-hook-up-tests-makefile-fix
> +++ a/lib/math/Makefile
> @@ -8,5 +8,4 @@ obj-$(CONFIG_RATIONAL) += rational.o
> obj-$(CONFIG_TEST_DIV64) += test_div64.o
> obj-$(CONFIG_TEST_MULDIV64) += test_mul_u64_u64_div_u64.o
> obj-$(CONFIG_RATIONAL_KUNIT_TEST) += rational-test.o
> -obj-$(CONFIG_GCD_KUNIT_TEST) += tests/gcd_kunit.o
> obj-y += tests/
> _
>
> and the x86_64 allmodconfig build failed thusly:
>
> lib/math/tests/prime_numbers_kunit.c: In function 'prime_numbers_test':
> lib/math/tests/prime_numbers_kunit.c:25:35: error: implicit declaration of function 'slow_is_prime_number'; did you mean 'is_prime_number'? [-Werror=implicit-function-declaration]
> 25 | const bool slow = slow_is_prime_number(x);
> | ^~~~~~~~~~~~~~~~~~~~
> | is_prime_number
>
>
> So, please redo against mm.git's mm-everything branch or its
> mm-nonmm-unstable branch and retest carefully.
Thanks for the clear instructions. I was able to reproduce. v4 is on its way.
© 2016 - 2025 Red Hat, Inc.