diff mbox series

[v2] lib/math: Add int_sqrt test suite

Message ID 20241024195511.72674-1-luis.hernandez093@gmail.com (mailing list archive)
State New
Headers show
Series [v2] lib/math: Add int_sqrt test suite | expand

Commit Message

Luis Felipe Hernandez Oct. 24, 2024, 7:55 p.m. UTC
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

Comments

Andy Shevchenko Oct. 25, 2024, 3:20 p.m. UTC | #1
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.
Luis Felipe Hernandez Oct. 25, 2024, 7:16 p.m. UTC | #2
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+19ysxQ@mail.gmail.com/

> 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/math/tests/Makefile?h=next-20241025
Kunit Test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib/math/tests/int_pow_kunit.c?h=next-20241025
Kconfig entry: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib/Kconfig.debug?h=next-20241025#n3103

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/Kconfig.debug?h=v6.12-rc4#n3092

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.com/
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
Andy Shevchenko Oct. 25, 2024, 8:38 p.m. UTC | #3
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+19ysxQ@mail.gmail.com/

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/math/tests/Makefile?h=next-20241025
> Kunit Test: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib/math/tests/int_pow_kunit.c?h=next-20241025
> Kconfig entry: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/tree/lib/Kconfig.debug?h=next-20241025#n3103
> 
> 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/Kconfig.debug?h=v6.12-rc4#n3092
> 
> 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.com/
> 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.
diff mbox series

Patch

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");