Commit 9ab61886 authored by Yu-Chun Lin's avatar Yu-Chun Lin Committed by Kees Cook
Browse files

lib/math: Add Kunit test suite for gcd()



Add a KUnit test suite for the gcd() function.
This test suite verifies the correctness of gcd() across various
scenarios, including edge cases.

Signed-off-by: default avatarYu-Chun Lin <eleanor15x@gmail.com>
Reviewed-by: default avatarKuan-Wei Chiu <visitorckw@gmail.com>
Link: https://lore.kernel.org/r/20250203075400.3431330-1-eleanor15x@gmail.com


Signed-off-by: default avatarKees Cook <kees@kernel.org>
parent 2be6ce9d
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -3222,6 +3222,19 @@ config INT_LOG_KUNIT_TEST

          If unsure, say N

config GCD_KUNIT_TEST
	tristate "Greatest common divisor test" if !KUNIT_ALL_TESTS
	depends on KUNIT
	default KUNIT_ALL_TESTS
	help
	  This option enables the KUnit test suite for the gcd() function,
	  which computes the greatest common divisor of two numbers.

	  This test suite verifies the correctness of gcd() across various
	  scenarios, including edge cases.

	  If unsure, say N

endif # RUNTIME_TESTING_MENU

config ARCH_USE_MEMTEST
+1 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only

obj-$(CONFIG_GCD_KUNIT_TEST)		+= gcd_kunit.o
obj-$(CONFIG_INT_LOG_KUNIT_TEST)	+= int_log_kunit.o
obj-$(CONFIG_INT_POW_KUNIT_TEST)	+= int_pow_kunit.o
obj-$(CONFIG_INT_SQRT_KUNIT_TEST)	+= int_sqrt_kunit.o
+56 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only

#include <kunit/test.h>
#include <linux/gcd.h>
#include <linux/limits.h>

struct test_case_params {
	unsigned long val1;
	unsigned long val2;
	unsigned long expected_result;
	const char *name;
};

static const struct test_case_params params[] = {
	{ 48, 18, 6, "GCD of 48 and 18" },
	{ 18, 48, 6, "GCD of 18 and 48" },
	{ 56, 98, 14, "GCD of 56 and 98" },
	{ 17, 13, 1, "Coprime numbers" },
	{ 101, 103, 1, "Coprime numbers" },
	{ 270, 192, 6, "GCD of 270 and 192" },
	{ 0, 5, 5, "GCD with zero" },
	{ 7, 0, 7, "GCD with zero reversed" },
	{ 36, 36, 36, "GCD of identical numbers" },
	{ ULONG_MAX, 1, 1, "GCD of max ulong and 1" },
	{ ULONG_MAX, ULONG_MAX, ULONG_MAX, "GCD of max ulong values" },
};

static void get_desc(const struct test_case_params *tc, char *desc)
{
	strscpy(desc, tc->name, KUNIT_PARAM_DESC_SIZE);
}

KUNIT_ARRAY_PARAM(gcd, params, get_desc);

static void gcd_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, gcd(tc->val1, tc->val2));
}

static struct kunit_case math_gcd_test_cases[] = {
	KUNIT_CASE_PARAM(gcd_test, gcd_gen_params),
	{}
};

static struct kunit_suite gcd_test_suite = {
	.name = "math-gcd",
	.test_cases = math_gcd_test_cases,
};

kunit_test_suite(gcd_test_suite);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("math.gcd KUnit test suite");
MODULE_AUTHOR("Yu-Chun Lin <eleanor15x@gmail.com>");