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 | 15 ++++++++ lib/math/Makefile | 1 + lib/math/tests/Makefile | 1 + lib/math/tests/int_sqrt_kunit.c | 66 +++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 lib/math/tests/int_sqrt_kunit.c
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index f3d723705879..147d9fef42e7 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -3161,6 +3161,21 @@ config INT_POW_TEST
If unsure, say N
+config INT_SQRT_KUNIT_TEST + tristate "Integer square root 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..853f023ae537 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-$(CONFIG_INT_SQRT_KUNIT_TEST) += tests/int_sqrt_kunit.o \ No newline at end of file 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..1798e1312eb7 --- /dev/null +++ b/lib/math/tests/int_sqrt_kunit.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <kunit/test.h> +#include <linux/limits.h> +#include <linux/math.h> +#include <linux/module.h> +#include <linux/string.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" }, + { 1, 1, "perfect square: square root of 1" }, + { 2, 1, "non-perfect square: square root of 2" }, + { 3, 1, "non-perfect square: square root of 3" }, + { 4, 2, "perfect square: square root of 4" }, + { 5, 2, "non-perfect square: square root of 5" }, + { 6, 2, "non-perfect square: square root of 6" }, + { 7, 2, "non-perfect square: square root of 7" }, + { 8, 2, "non-perfect square: square root of 8" }, + { 9, 3, "perfect square: square root of 9" }, + { 15, 3, "non-perfect square: square root of 15 (N-1 from 16)" }, + { 16, 4, "perfect square: square root of 16" }, + { 17, 4, "non-perfect square: square root of 17 (N+1 from 16)" }, + { 80, 8, "non-perfect square: square root of 80 (N-1 from 81)" }, + { 81, 9, "perfect square: square root of 81" }, + { 82, 9, "non-perfect square: square root of 82 (N+1 from 81)" }, + { 255, 15, "non-perfect square: square root of 255 (N-1 from 256)" }, + { 256, 16, "perfect square: square root of 256" }, + { 257, 16, "non-perfect square: square root of 257 (N+1 from 256)" }, + { 2147483648, 46340, "large input: square root of 2147483648" }, + { 4294967295, 65535, "edge case: ULONG_MAX for 32-bit" }, +}; + +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, Dec 12, 2024 at 11:26:50PM -0500, 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() math library function.
Signed-off-by: Luis Felipe Hernandez luis.hernandez093@gmail.com
LGTM. Feel free to add:
Reviewed-by: Kuan-Wei Chiu visitorckw@gmail.com
Regards, Kuan-Wei
lib/Kconfig.debug | 15 ++++++++ lib/math/Makefile | 1 + lib/math/tests/Makefile | 1 + lib/math/tests/int_sqrt_kunit.c | 66 +++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 lib/math/tests/int_sqrt_kunit.c
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index f3d723705879..147d9fef42e7 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -3161,6 +3161,21 @@ config INT_POW_TEST If unsure, say N +config INT_SQRT_KUNIT_TEST
- tristate "Integer square root 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..853f023ae537 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-$(CONFIG_INT_SQRT_KUNIT_TEST) += tests/int_sqrt_kunit.o \ No newline at end of file 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..1798e1312eb7 --- /dev/null +++ b/lib/math/tests/int_sqrt_kunit.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-only
+#include <kunit/test.h> +#include <linux/limits.h> +#include <linux/math.h> +#include <linux/module.h> +#include <linux/string.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" },
- { 1, 1, "perfect square: square root of 1" },
- { 2, 1, "non-perfect square: square root of 2" },
- { 3, 1, "non-perfect square: square root of 3" },
- { 4, 2, "perfect square: square root of 4" },
- { 5, 2, "non-perfect square: square root of 5" },
- { 6, 2, "non-perfect square: square root of 6" },
- { 7, 2, "non-perfect square: square root of 7" },
- { 8, 2, "non-perfect square: square root of 8" },
- { 9, 3, "perfect square: square root of 9" },
- { 15, 3, "non-perfect square: square root of 15 (N-1 from 16)" },
- { 16, 4, "perfect square: square root of 16" },
- { 17, 4, "non-perfect square: square root of 17 (N+1 from 16)" },
- { 80, 8, "non-perfect square: square root of 80 (N-1 from 81)" },
- { 81, 9, "perfect square: square root of 81" },
- { 82, 9, "non-perfect square: square root of 82 (N+1 from 81)" },
- { 255, 15, "non-perfect square: square root of 255 (N-1 from 256)" },
- { 256, 16, "perfect square: square root of 256" },
- { 257, 16, "non-perfect square: square root of 257 (N+1 from 256)" },
- { 2147483648, 46340, "large input: square root of 2147483648" },
- { 4294967295, 65535, "edge case: ULONG_MAX for 32-bit" },
+};
+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");
2.47.1
linux-kselftest-mirror@lists.linaro.org