Adds test suite for integer based square root function.
The test suite is designed to verify the correctness of the int_sqrt math library function.
Signed-off-by: Luis Felipe Hernandez luis.hernandez093@gmail.com --- lib/Kconfig.debug | 16 +++++++++++ lib/math/Makefile | 1 + lib/math/tests/Makefile | 1 + lib/math/tests/int_sqrt_kunit.c | 51 +++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 lib/math/tests/int_sqrt_kunit.c
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 7312ae7c3cc5..772c681dff3e 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -2993,6 +2993,22 @@ config TEST_OBJPOOL
If unsure, say N.
+config INT_SQRT_KUNIT_TEST + tristate "Integer square root test test" if !KUNIT_ALL_TESTS + depends on KUNIT + default KUNIT_ALL_TESTS + help + This option enables the KUnit test suite for the int_sqrt function, + which performs square root calculation. The test suite checks + various scenarios, including edge cases, to ensure correctness. + + Enabling this option will include tests that check various scenarios + and edge cases to ensure the accuracy and reliability of the square root + function. + + If unsure, say N + + endif # RUNTIME_TESTING_MENU
config ARCH_USE_MEMTEST diff --git a/lib/math/Makefile b/lib/math/Makefile index 3ef11305f8d2..25bcb968b369 100644 --- a/lib/math/Makefile +++ b/lib/math/Makefile @@ -9,3 +9,4 @@ obj-$(CONFIG_INT_POW_TEST) += tests/int_pow_kunit.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-y += tests/ diff --git a/lib/math/tests/Makefile b/lib/math/tests/Makefile index 6a169123320a..e1a79f093b2d 100644 --- a/lib/math/tests/Makefile +++ b/lib/math/tests/Makefile @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only
obj-$(CONFIG_INT_POW_TEST) += int_pow_kunit.o +obj-$(CONFIG_INT_SQRT_KUNIT_TEST) += int_sqrt_kunit.o diff --git a/lib/math/tests/int_sqrt_kunit.c b/lib/math/tests/int_sqrt_kunit.c new file mode 100644 index 000000000000..a93aba31cd05 --- /dev/null +++ b/lib/math/tests/int_sqrt_kunit.c @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <kunit/test.h> +#include <linux/math.h> +#include <linux/module.h> +#include <linux/string.h> +#include <limits.h> + +struct test_case_params { + unsigned long x; + unsigned long expected_result; + const char *name; +}; + +static const struct test_case_params params[] = { + { 0, 0, "edge-case: square root of 0" }, + { 4, 2, "perfect square: square root of 4" }, + { 81, 9, "perfect square: square root of 9" }, + { 2, 1, "non-perfect square: square root of 2" }, + { 5, 2, "non-perfect square: square root of 5"}, + { ULONG_MAX, 4294967295, "large input"}, +}; + +static void get_desc(const struct test_case_params *tc, char *desc) +{ + strscpy(desc, tc->name, KUNIT_PARAM_DESC_SIZE); +} + +KUNIT_ARRAY_PARAM(int_sqrt, params, get_desc); + +static void int_sqrt_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_sqrt(tc->x)); +} + +static struct kunit_case math_int_sqrt_test_cases[] = { + KUNIT_CASE_PARAM(int_sqrt_test, int_sqrt_gen_params), + {} +}; + +static struct kunit_suite int_sqrt_test_suite = { + .name = "math-int_sqrt", + .test_cases = math_int_sqrt_test_cases, +}; + +kunit_test_suites(&int_sqrt_test_suite); + +MODULE_DESCRIPTION("math.int_sqrt KUnit test suite"); +MODULE_LICENSE("GPL");
On Thu, Oct 24, 2024 at 03:55:09PM -0400, Luis Felipe Hernandez wrote:
Adds test suite for integer based square root function.
The test suite is designed to verify the correctness of the int_sqrt
int_aqrt()
math library function.
...
--- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug
+config INT_SQRT_KUNIT_TEST
- tristate "Integer square root test test" if !KUNIT_ALL_TESTS
- depends on KUNIT
- default KUNIT_ALL_TESTS
- help
This option enables the KUnit test suite for the int_sqrt function,
which performs square root calculation. The test suite checks
various scenarios, including edge cases, to ensure correctness.
Enabling this option will include tests that check various scenarios
and edge cases to ensure the accuracy and reliability of the square root
function.
If unsure, say N
One blank line is enough.
Shouldn't the thing to be in lib/tests/Kconfig?
...
obj-$(CONFIG_INT_POW_TEST) += int_pow_kunit.o
Where is this? I don't see it right now in the Linux Next...
...
+#include <kunit/test.h> +#include <linux/math.h> +#include <linux/module.h> +#include <linux/string.h> +#include <limits.h>
linux/limits.h, of course.
Sorry that I wasn't clear about this, but it's kinda rule of thumb that all headers in 99.999% kernel-space related files in the Linux kernel are from in-project folders and not from outside.
Thank you for your feedback and patience Andy. I apologize about the hastiness of the v2 patch. I've addressed the feedback and would like to wait for any additional reviews before sending out a v3.
In the meantime I wanted to answer the questions posed to the best of my ability.
Shouldn't the thing to be in lib/tests/Kconfig?
The Kconfig entries for lib/math are located in lib/Kconfig.debug as per David Gow in https://lore.kernel.org/all/CABVgOS=-vh5TqHFCq_jo=ffq8v_nGgr6JsPnOZag3e6+19y...
Where is this? I don't see it right now in the Linux Next...
It's a previous kunit test suite, it should be in both next and mainline Makefile: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib... Kunit Test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib... Kconfig entry: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib...
The Kconfig entry was fixed in next by Kuan-Wei Chiu in https://lore.kernel.org/all/20241005222221.2154393-1-visitorckw@gmail.com/ which I had incorrectly placed at the top-level in my original patch, hence the discrepancy in the location on mainline: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/...
One more thing to note is that there is a patch that organized the tests in lib/math as per the documentation: https://lore.kernel.org/all/20241005222446.10471-1-luis.hernandez093@gmail.c... Which resulted in a conflict and the fix was carried over: https://lore.kernel.org/all/20241009162719.0adaea37@canb.auug.org.au/
Again, I appreciate your time and review. I hope this answered some of your questions. I'll continue to follow this thread so as to make any additional fixes from further reviews before sending out the next version.
Best regards,
Felipe
On Fri, Oct 25, 2024 at 03:16:41PM -0400, Luis Felipe Hernandez wrote:
Thank you for your feedback and patience Andy. I apologize about the hastiness of the v2 patch. I've addressed the feedback and would like to wait for any additional reviews before sending out a v3.
In the meantime I wanted to answer the questions posed to the best of my ability.
Shouldn't the thing to be in lib/tests/Kconfig?
The Kconfig entries for lib/math are located in lib/Kconfig.debug as per David Gow in https://lore.kernel.org/all/CABVgOS=-vh5TqHFCq_jo=ffq8v_nGgr6JsPnOZag3e6+19y...
He put it as "Somehow confusingly, ..." meaning to me as a signal that he will agree with me that moving that to lib/tests/Kconfig seems like a right move.
Where is this? I don't see it right now in the Linux Next...
It's a previous kunit test suite, it should be in both next and mainline Makefile: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib... Kunit Test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib... Kconfig entry: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib...
The Kconfig entry was fixed in next by Kuan-Wei Chiu in https://lore.kernel.org/all/20241005222221.2154393-1-visitorckw@gmail.com/ which I had incorrectly placed at the top-level in my original patch, hence the discrepancy in the location on mainline: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/lib/...
One more thing to note is that there is a patch that organized the tests in lib/math as per the documentation: https://lore.kernel.org/all/20241005222446.10471-1-luis.hernandez093@gmail.c... Which resulted in a conflict and the fix was carried over: https://lore.kernel.org/all/20241009162719.0adaea37@canb.auug.org.au/
Again, I appreciate your time and review. I hope this answered some of your questions. I'll continue to follow this thread so as to make any additional fixes from further reviews before sending out the next version.
Okay, I will wait for new Linux next tags.
Hi Luis,
kernel test robot noticed the following build errors:
[auto build test ERROR on v6.12-rc4] [also build test ERROR on linus/master] [cannot apply to akpm-mm/mm-nonmm-unstable next-20241025] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Luis-Felipe-Hernandez/lib-mat... base: v6.12-rc4 patch link: https://lore.kernel.org/r/20241024195511.72674-1-luis.hernandez093%40gmail.c... patch subject: [PATCH v2] lib/math: Add int_sqrt test suite config: i386-buildonly-randconfig-001-20241026 (https://download.01.org/0day-ci/archive/20241026/202410260709.2XVfASBv-lkp@i...) compiler: clang version 19.1.2 (https://github.com/llvm/llvm-project 7ba7d8e2f7b6445b60679da826210cdde29eaf8b) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241026/202410260709.2XVfASBv-lkp@i...)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot lkp@intel.com | Closes: https://lore.kernel.org/oe-kbuild-all/202410260709.2XVfASBv-lkp@intel.com/
All errors (new ones prefixed by >>):
lib/math/tests/int_sqrt_kunit.c:7:10: fatal error: 'limits.h' file not found
7 | #include <limits.h> | ^~~~~~~~~~ 1 error generated.
Kconfig warnings: (for reference only) WARNING: unmet direct dependencies detected for GET_FREE_REGION Depends on [n]: SPARSEMEM [=n] Selected by [y]: - RESOURCE_KUNIT_TEST [=y] && RUNTIME_TESTING_MENU [=y] && KUNIT [=y]
vim +7 lib/math/tests/int_sqrt_kunit.c
2 3 #include <kunit/test.h> 4 #include <linux/math.h> 5 #include <linux/module.h> 6 #include <linux/string.h>
7 #include <limits.h>
8
Hi Luis,
kernel test robot noticed the following build errors:
[auto build test ERROR on v6.12-rc4] [also build test ERROR on linus/master] [cannot apply to akpm-mm/mm-nonmm-unstable next-20241025] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Luis-Felipe-Hernandez/lib-mat... base: v6.12-rc4 patch link: https://lore.kernel.org/r/20241024195511.72674-1-luis.hernandez093%40gmail.c... patch subject: [PATCH v2] lib/math: Add int_sqrt test suite config: m68k-sun3_defconfig (https://download.01.org/0day-ci/archive/20241026/202410260915.z3q6ZOGS-lkp@i...) compiler: m68k-linux-gcc (GCC) 13.3.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241026/202410260915.z3q6ZOGS-lkp@i...)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot lkp@intel.com | Closes: https://lore.kernel.org/oe-kbuild-all/202410260915.z3q6ZOGS-lkp@intel.com/
All errors (new ones prefixed by >>):
lib/math/tests/int_sqrt_kunit.c:7:10: fatal error: limits.h: No such file or directory
7 | #include <limits.h> | ^~~~~~~~~~ compilation terminated.
Kconfig warnings: (for reference only) WARNING: unmet direct dependencies detected for GET_FREE_REGION Depends on [n]: SPARSEMEM [=n] Selected by [m]: - RESOURCE_KUNIT_TEST [=m] && RUNTIME_TESTING_MENU [=y] && KUNIT [=m]
vim +7 lib/math/tests/int_sqrt_kunit.c
2 3 #include <kunit/test.h> 4 #include <linux/math.h> 5 #include <linux/module.h> 6 #include <linux/string.h>
7 #include <limits.h>
8
linux-kselftest-mirror@lists.linaro.org