xref: /linux/lib/tests/bitops_kunit.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
14101b3b5SRyota Sakamoto // SPDX-License-Identifier: GPL-2.0-only
24101b3b5SRyota Sakamoto /*
34101b3b5SRyota Sakamoto  * Copyright (C) 2020 Intel Corporation
44101b3b5SRyota Sakamoto  * Copyright (C) 2026 Ryota Sakamoto <sakamo.ryota@gmail.com>
54101b3b5SRyota Sakamoto  */
64101b3b5SRyota Sakamoto 
74101b3b5SRyota Sakamoto #include <linux/bitops.h>
84101b3b5SRyota Sakamoto #include <linux/module.h>
94101b3b5SRyota Sakamoto #include <kunit/test.h>
104101b3b5SRyota Sakamoto 
114101b3b5SRyota Sakamoto /* use an enum because that's the most common BITMAP usage */
124101b3b5SRyota Sakamoto enum bitops_fun {
134101b3b5SRyota Sakamoto 	BITOPS_4 = 4,
144101b3b5SRyota Sakamoto 	BITOPS_7 = 7,
154101b3b5SRyota Sakamoto 	BITOPS_11 = 11,
164101b3b5SRyota Sakamoto 	BITOPS_31 = 31,
174101b3b5SRyota Sakamoto 	BITOPS_88 = 88,
184101b3b5SRyota Sakamoto 	BITOPS_LENGTH = 256
194101b3b5SRyota Sakamoto };
204101b3b5SRyota Sakamoto 
214101b3b5SRyota Sakamoto struct bitops_test_case {
224101b3b5SRyota Sakamoto 	const char *str;
234101b3b5SRyota Sakamoto 	const long nr;
244101b3b5SRyota Sakamoto };
254101b3b5SRyota Sakamoto 
264101b3b5SRyota Sakamoto static struct bitops_test_case bitops_cases[] = {
274101b3b5SRyota Sakamoto 	{
284101b3b5SRyota Sakamoto 		.str = "BITOPS_4",
294101b3b5SRyota Sakamoto 		.nr = BITOPS_4,
304101b3b5SRyota Sakamoto 	},
314101b3b5SRyota Sakamoto 	{
324101b3b5SRyota Sakamoto 		.str = "BITOPS_7",
334101b3b5SRyota Sakamoto 		.nr = BITOPS_7,
344101b3b5SRyota Sakamoto 	},
354101b3b5SRyota Sakamoto 	{
364101b3b5SRyota Sakamoto 		.str = "BITOPS_11",
374101b3b5SRyota Sakamoto 		.nr = BITOPS_11,
384101b3b5SRyota Sakamoto 	},
394101b3b5SRyota Sakamoto 	{
404101b3b5SRyota Sakamoto 		.str = "BITOPS_31",
414101b3b5SRyota Sakamoto 		.nr = BITOPS_31,
424101b3b5SRyota Sakamoto 	},
434101b3b5SRyota Sakamoto 	{
444101b3b5SRyota Sakamoto 		.str = "BITOPS_88",
454101b3b5SRyota Sakamoto 		.nr = BITOPS_88,
464101b3b5SRyota Sakamoto 	},
474101b3b5SRyota Sakamoto };
484101b3b5SRyota Sakamoto 
494101b3b5SRyota Sakamoto KUNIT_ARRAY_PARAM_DESC(bitops, bitops_cases, str);
504101b3b5SRyota Sakamoto 
514101b3b5SRyota Sakamoto static void test_set_bit_clear_bit(struct kunit *test)
524101b3b5SRyota Sakamoto {
534101b3b5SRyota Sakamoto 	const struct bitops_test_case *params = test->param_value;
544101b3b5SRyota Sakamoto 	DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
554101b3b5SRyota Sakamoto 	int bit_set;
564101b3b5SRyota Sakamoto 
574101b3b5SRyota Sakamoto 	bitmap_zero(bitmap, BITOPS_LENGTH);
584101b3b5SRyota Sakamoto 
594101b3b5SRyota Sakamoto 	set_bit(params->nr, bitmap);
604101b3b5SRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
614101b3b5SRyota Sakamoto 
624101b3b5SRyota Sakamoto 	clear_bit(params->nr, bitmap);
634101b3b5SRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
644101b3b5SRyota Sakamoto 
654101b3b5SRyota Sakamoto 	bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
664101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
674101b3b5SRyota Sakamoto }
684101b3b5SRyota Sakamoto 
69*6711069dSRyota Sakamoto static void test_change_bit(struct kunit *test)
70*6711069dSRyota Sakamoto {
71*6711069dSRyota Sakamoto 	const struct bitops_test_case *params = test->param_value;
72*6711069dSRyota Sakamoto 	DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
73*6711069dSRyota Sakamoto 	int bit_set;
74*6711069dSRyota Sakamoto 
75*6711069dSRyota Sakamoto 	bitmap_zero(bitmap, BITOPS_LENGTH);
76*6711069dSRyota Sakamoto 
77*6711069dSRyota Sakamoto 	change_bit(params->nr, bitmap);
78*6711069dSRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
79*6711069dSRyota Sakamoto 
80*6711069dSRyota Sakamoto 	change_bit(params->nr, bitmap);
81*6711069dSRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
82*6711069dSRyota Sakamoto 
83*6711069dSRyota Sakamoto 	bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
84*6711069dSRyota Sakamoto 	KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
85*6711069dSRyota Sakamoto }
86*6711069dSRyota Sakamoto 
87*6711069dSRyota Sakamoto static void test_test_and_set_bit_test_and_clear_bit(struct kunit *test)
88*6711069dSRyota Sakamoto {
89*6711069dSRyota Sakamoto 	const struct bitops_test_case *params = test->param_value;
90*6711069dSRyota Sakamoto 	DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
91*6711069dSRyota Sakamoto 	int bit_set;
92*6711069dSRyota Sakamoto 
93*6711069dSRyota Sakamoto 	bitmap_zero(bitmap, BITOPS_LENGTH);
94*6711069dSRyota Sakamoto 
95*6711069dSRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_and_set_bit(params->nr, bitmap));
96*6711069dSRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
97*6711069dSRyota Sakamoto 
98*6711069dSRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_and_set_bit(params->nr, bitmap));
99*6711069dSRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
100*6711069dSRyota Sakamoto 
101*6711069dSRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_and_clear_bit(params->nr, bitmap));
102*6711069dSRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
103*6711069dSRyota Sakamoto 
104*6711069dSRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_and_clear_bit(params->nr, bitmap));
105*6711069dSRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
106*6711069dSRyota Sakamoto 
107*6711069dSRyota Sakamoto 	bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
108*6711069dSRyota Sakamoto 	KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
109*6711069dSRyota Sakamoto }
110*6711069dSRyota Sakamoto 
111*6711069dSRyota Sakamoto static void test_test_and_change_bit(struct kunit *test)
112*6711069dSRyota Sakamoto {
113*6711069dSRyota Sakamoto 	const struct bitops_test_case *params = test->param_value;
114*6711069dSRyota Sakamoto 	DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
115*6711069dSRyota Sakamoto 	int bit_set;
116*6711069dSRyota Sakamoto 
117*6711069dSRyota Sakamoto 	bitmap_zero(bitmap, BITOPS_LENGTH);
118*6711069dSRyota Sakamoto 
119*6711069dSRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_and_change_bit(params->nr, bitmap));
120*6711069dSRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
121*6711069dSRyota Sakamoto 
122*6711069dSRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_and_change_bit(params->nr, bitmap));
123*6711069dSRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
124*6711069dSRyota Sakamoto 
125*6711069dSRyota Sakamoto 	bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
126*6711069dSRyota Sakamoto 	KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
127*6711069dSRyota Sakamoto }
128*6711069dSRyota Sakamoto 
1294101b3b5SRyota Sakamoto struct order_test_case {
1304101b3b5SRyota Sakamoto 	const char *str;
1314101b3b5SRyota Sakamoto 	const unsigned int count;
1324101b3b5SRyota Sakamoto 	const int expected;
1334101b3b5SRyota Sakamoto };
1344101b3b5SRyota Sakamoto 
1354101b3b5SRyota Sakamoto static struct order_test_case order_test_cases[] = {
1364101b3b5SRyota Sakamoto 	{"0x00000003", 0x00000003,  2},
1374101b3b5SRyota Sakamoto 	{"0x00000004", 0x00000004,  2},
1384101b3b5SRyota Sakamoto 	{"0x00001fff", 0x00001fff, 13},
1394101b3b5SRyota Sakamoto 	{"0x00002000", 0x00002000, 13},
1404101b3b5SRyota Sakamoto 	{"0x50000000", 0x50000000, 31},
1414101b3b5SRyota Sakamoto 	{"0x80000000", 0x80000000, 31},
1424101b3b5SRyota Sakamoto 	{"0x80003000", 0x80003000, 32},
1434101b3b5SRyota Sakamoto };
1444101b3b5SRyota Sakamoto 
1454101b3b5SRyota Sakamoto KUNIT_ARRAY_PARAM_DESC(order, order_test_cases, str);
1464101b3b5SRyota Sakamoto 
1474101b3b5SRyota Sakamoto static void test_get_count_order(struct kunit *test)
1484101b3b5SRyota Sakamoto {
1494101b3b5SRyota Sakamoto 	const struct order_test_case *params = test->param_value;
1504101b3b5SRyota Sakamoto 
1514101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, get_count_order(params->count), params->expected);
1524101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, get_count_order_long(params->count), params->expected);
1534101b3b5SRyota Sakamoto }
1544101b3b5SRyota Sakamoto 
1554101b3b5SRyota Sakamoto #ifdef CONFIG_64BIT
1564101b3b5SRyota Sakamoto struct order_long_test_case {
1574101b3b5SRyota Sakamoto 	const char *str;
1584101b3b5SRyota Sakamoto 	const unsigned long count;
1594101b3b5SRyota Sakamoto 	const int expected;
1604101b3b5SRyota Sakamoto };
1614101b3b5SRyota Sakamoto 
1624101b3b5SRyota Sakamoto static struct order_long_test_case order_long_test_cases[] = {
1634101b3b5SRyota Sakamoto 	{"0x0000000300000000", 0x0000000300000000, 34},
1644101b3b5SRyota Sakamoto 	{"0x0000000400000000", 0x0000000400000000, 34},
1654101b3b5SRyota Sakamoto 	{"0x00001fff00000000", 0x00001fff00000000, 45},
1664101b3b5SRyota Sakamoto 	{"0x0000200000000000", 0x0000200000000000, 45},
1674101b3b5SRyota Sakamoto 	{"0x5000000000000000", 0x5000000000000000, 63},
1684101b3b5SRyota Sakamoto 	{"0x8000000000000000", 0x8000000000000000, 63},
1694101b3b5SRyota Sakamoto 	{"0x8000300000000000", 0x8000300000000000, 64},
1704101b3b5SRyota Sakamoto };
1714101b3b5SRyota Sakamoto 
1724101b3b5SRyota Sakamoto KUNIT_ARRAY_PARAM_DESC(order_long, order_long_test_cases, str);
1734101b3b5SRyota Sakamoto 
1744101b3b5SRyota Sakamoto static void test_get_count_order_long(struct kunit *test)
1754101b3b5SRyota Sakamoto {
1764101b3b5SRyota Sakamoto 	const struct order_long_test_case *params = test->param_value;
1774101b3b5SRyota Sakamoto 
1784101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, get_count_order_long(params->count), params->expected);
1794101b3b5SRyota Sakamoto }
1804101b3b5SRyota Sakamoto #endif
1814101b3b5SRyota Sakamoto 
1824101b3b5SRyota Sakamoto static struct kunit_case bitops_test_cases[] = {
1834101b3b5SRyota Sakamoto 	KUNIT_CASE_PARAM(test_set_bit_clear_bit, bitops_gen_params),
184*6711069dSRyota Sakamoto 	KUNIT_CASE_PARAM(test_change_bit, bitops_gen_params),
185*6711069dSRyota Sakamoto 	KUNIT_CASE_PARAM(test_test_and_set_bit_test_and_clear_bit, bitops_gen_params),
186*6711069dSRyota Sakamoto 	KUNIT_CASE_PARAM(test_test_and_change_bit, bitops_gen_params),
1874101b3b5SRyota Sakamoto 	KUNIT_CASE_PARAM(test_get_count_order, order_gen_params),
1884101b3b5SRyota Sakamoto #ifdef CONFIG_64BIT
1894101b3b5SRyota Sakamoto 	KUNIT_CASE_PARAM(test_get_count_order_long, order_long_gen_params),
1904101b3b5SRyota Sakamoto #endif
1914101b3b5SRyota Sakamoto 	{},
1924101b3b5SRyota Sakamoto };
1934101b3b5SRyota Sakamoto 
1944101b3b5SRyota Sakamoto static struct kunit_suite bitops_test_suite = {
1954101b3b5SRyota Sakamoto 	.name = "bitops",
1964101b3b5SRyota Sakamoto 	.test_cases = bitops_test_cases,
1974101b3b5SRyota Sakamoto };
1984101b3b5SRyota Sakamoto 
1994101b3b5SRyota Sakamoto kunit_test_suite(bitops_test_suite);
2004101b3b5SRyota Sakamoto 
2014101b3b5SRyota Sakamoto MODULE_AUTHOR("Jesse Brandeburg <jesse.brandeburg@intel.com>");
2024101b3b5SRyota Sakamoto MODULE_AUTHOR("Wei Yang <richard.weiyang@gmail.com>");
2034101b3b5SRyota Sakamoto MODULE_AUTHOR("Ryota Sakamoto <sakamo.ryota@gmail.com>");
2044101b3b5SRyota Sakamoto MODULE_LICENSE("GPL");
2054101b3b5SRyota Sakamoto MODULE_DESCRIPTION("Bit testing module");
206