Commit 0fafc9e1 authored by Luis Felipe Hernandez's avatar Luis Felipe Hernandez Committed by Andrew Morton
Browse files

lib/math: add int_sqrt test suite

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.

Link: https://lkml.kernel.org/r/20241213042701.1037467-1-luis.hernandez093@gmail.com


Signed-off-by: default avatarLuis Felipe Hernandez <luis.hernandez093@gmail.com>
Reviewed-by: default avatarKuan-Wei Chiu <visitorckw@gmail.com>
Cc: David Gow <davidgow@google.com>
Cc: Ricardo B. Marliere <rbm@suse.com>
Cc: Shuah Khan <skhan@linuxfoundation.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent eb7a18eb
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -3174,6 +3174,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
+1 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
# 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
+66 −0
Original line number Diff line number Diff line
// 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");