xref: /linux/lib/tests/bitops_kunit.c (revision 4101b3b571701cdf1081b2f96124b1daaeaebbf1)
1*4101b3b5SRyota Sakamoto // SPDX-License-Identifier: GPL-2.0-only
2*4101b3b5SRyota Sakamoto /*
3*4101b3b5SRyota Sakamoto  * Copyright (C) 2020 Intel Corporation
4*4101b3b5SRyota Sakamoto  * Copyright (C) 2026 Ryota Sakamoto <sakamo.ryota@gmail.com>
5*4101b3b5SRyota Sakamoto  */
6*4101b3b5SRyota Sakamoto 
7*4101b3b5SRyota Sakamoto #include <linux/bitops.h>
8*4101b3b5SRyota Sakamoto #include <linux/module.h>
9*4101b3b5SRyota Sakamoto #include <kunit/test.h>
10*4101b3b5SRyota Sakamoto 
11*4101b3b5SRyota Sakamoto /* use an enum because that's the most common BITMAP usage */
12*4101b3b5SRyota Sakamoto enum bitops_fun {
13*4101b3b5SRyota Sakamoto 	BITOPS_4 = 4,
14*4101b3b5SRyota Sakamoto 	BITOPS_7 = 7,
15*4101b3b5SRyota Sakamoto 	BITOPS_11 = 11,
16*4101b3b5SRyota Sakamoto 	BITOPS_31 = 31,
17*4101b3b5SRyota Sakamoto 	BITOPS_88 = 88,
18*4101b3b5SRyota Sakamoto 	BITOPS_LENGTH = 256
19*4101b3b5SRyota Sakamoto };
20*4101b3b5SRyota Sakamoto 
21*4101b3b5SRyota Sakamoto struct bitops_test_case {
22*4101b3b5SRyota Sakamoto 	const char *str;
23*4101b3b5SRyota Sakamoto 	const long nr;
24*4101b3b5SRyota Sakamoto };
25*4101b3b5SRyota Sakamoto 
26*4101b3b5SRyota Sakamoto static struct bitops_test_case bitops_cases[] = {
27*4101b3b5SRyota Sakamoto 	{
28*4101b3b5SRyota Sakamoto 		.str = "BITOPS_4",
29*4101b3b5SRyota Sakamoto 		.nr = BITOPS_4,
30*4101b3b5SRyota Sakamoto 	},
31*4101b3b5SRyota Sakamoto 	{
32*4101b3b5SRyota Sakamoto 		.str = "BITOPS_7",
33*4101b3b5SRyota Sakamoto 		.nr = BITOPS_7,
34*4101b3b5SRyota Sakamoto 	},
35*4101b3b5SRyota Sakamoto 	{
36*4101b3b5SRyota Sakamoto 		.str = "BITOPS_11",
37*4101b3b5SRyota Sakamoto 		.nr = BITOPS_11,
38*4101b3b5SRyota Sakamoto 	},
39*4101b3b5SRyota Sakamoto 	{
40*4101b3b5SRyota Sakamoto 		.str = "BITOPS_31",
41*4101b3b5SRyota Sakamoto 		.nr = BITOPS_31,
42*4101b3b5SRyota Sakamoto 	},
43*4101b3b5SRyota Sakamoto 	{
44*4101b3b5SRyota Sakamoto 		.str = "BITOPS_88",
45*4101b3b5SRyota Sakamoto 		.nr = BITOPS_88,
46*4101b3b5SRyota Sakamoto 	},
47*4101b3b5SRyota Sakamoto };
48*4101b3b5SRyota Sakamoto 
49*4101b3b5SRyota Sakamoto KUNIT_ARRAY_PARAM_DESC(bitops, bitops_cases, str);
50*4101b3b5SRyota Sakamoto 
51*4101b3b5SRyota Sakamoto static void test_set_bit_clear_bit(struct kunit *test)
52*4101b3b5SRyota Sakamoto {
53*4101b3b5SRyota Sakamoto 	const struct bitops_test_case *params = test->param_value;
54*4101b3b5SRyota Sakamoto 	DECLARE_BITMAP(bitmap, BITOPS_LENGTH);
55*4101b3b5SRyota Sakamoto 	int bit_set;
56*4101b3b5SRyota Sakamoto 
57*4101b3b5SRyota Sakamoto 	bitmap_zero(bitmap, BITOPS_LENGTH);
58*4101b3b5SRyota Sakamoto 
59*4101b3b5SRyota Sakamoto 	set_bit(params->nr, bitmap);
60*4101b3b5SRyota Sakamoto 	KUNIT_EXPECT_TRUE(test, test_bit(params->nr, bitmap));
61*4101b3b5SRyota Sakamoto 
62*4101b3b5SRyota Sakamoto 	clear_bit(params->nr, bitmap);
63*4101b3b5SRyota Sakamoto 	KUNIT_EXPECT_FALSE(test, test_bit(params->nr, bitmap));
64*4101b3b5SRyota Sakamoto 
65*4101b3b5SRyota Sakamoto 	bit_set = find_first_bit(bitmap, BITOPS_LENGTH);
66*4101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, bit_set, BITOPS_LENGTH);
67*4101b3b5SRyota Sakamoto }
68*4101b3b5SRyota Sakamoto 
69*4101b3b5SRyota Sakamoto struct order_test_case {
70*4101b3b5SRyota Sakamoto 	const char *str;
71*4101b3b5SRyota Sakamoto 	const unsigned int count;
72*4101b3b5SRyota Sakamoto 	const int expected;
73*4101b3b5SRyota Sakamoto };
74*4101b3b5SRyota Sakamoto 
75*4101b3b5SRyota Sakamoto static struct order_test_case order_test_cases[] = {
76*4101b3b5SRyota Sakamoto 	{"0x00000003", 0x00000003,  2},
77*4101b3b5SRyota Sakamoto 	{"0x00000004", 0x00000004,  2},
78*4101b3b5SRyota Sakamoto 	{"0x00001fff", 0x00001fff, 13},
79*4101b3b5SRyota Sakamoto 	{"0x00002000", 0x00002000, 13},
80*4101b3b5SRyota Sakamoto 	{"0x50000000", 0x50000000, 31},
81*4101b3b5SRyota Sakamoto 	{"0x80000000", 0x80000000, 31},
82*4101b3b5SRyota Sakamoto 	{"0x80003000", 0x80003000, 32},
83*4101b3b5SRyota Sakamoto };
84*4101b3b5SRyota Sakamoto 
85*4101b3b5SRyota Sakamoto KUNIT_ARRAY_PARAM_DESC(order, order_test_cases, str);
86*4101b3b5SRyota Sakamoto 
87*4101b3b5SRyota Sakamoto static void test_get_count_order(struct kunit *test)
88*4101b3b5SRyota Sakamoto {
89*4101b3b5SRyota Sakamoto 	const struct order_test_case *params = test->param_value;
90*4101b3b5SRyota Sakamoto 
91*4101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, get_count_order(params->count), params->expected);
92*4101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, get_count_order_long(params->count), params->expected);
93*4101b3b5SRyota Sakamoto }
94*4101b3b5SRyota Sakamoto 
95*4101b3b5SRyota Sakamoto #ifdef CONFIG_64BIT
96*4101b3b5SRyota Sakamoto struct order_long_test_case {
97*4101b3b5SRyota Sakamoto 	const char *str;
98*4101b3b5SRyota Sakamoto 	const unsigned long count;
99*4101b3b5SRyota Sakamoto 	const int expected;
100*4101b3b5SRyota Sakamoto };
101*4101b3b5SRyota Sakamoto 
102*4101b3b5SRyota Sakamoto static struct order_long_test_case order_long_test_cases[] = {
103*4101b3b5SRyota Sakamoto 	{"0x0000000300000000", 0x0000000300000000, 34},
104*4101b3b5SRyota Sakamoto 	{"0x0000000400000000", 0x0000000400000000, 34},
105*4101b3b5SRyota Sakamoto 	{"0x00001fff00000000", 0x00001fff00000000, 45},
106*4101b3b5SRyota Sakamoto 	{"0x0000200000000000", 0x0000200000000000, 45},
107*4101b3b5SRyota Sakamoto 	{"0x5000000000000000", 0x5000000000000000, 63},
108*4101b3b5SRyota Sakamoto 	{"0x8000000000000000", 0x8000000000000000, 63},
109*4101b3b5SRyota Sakamoto 	{"0x8000300000000000", 0x8000300000000000, 64},
110*4101b3b5SRyota Sakamoto };
111*4101b3b5SRyota Sakamoto 
112*4101b3b5SRyota Sakamoto KUNIT_ARRAY_PARAM_DESC(order_long, order_long_test_cases, str);
113*4101b3b5SRyota Sakamoto 
114*4101b3b5SRyota Sakamoto static void test_get_count_order_long(struct kunit *test)
115*4101b3b5SRyota Sakamoto {
116*4101b3b5SRyota Sakamoto 	const struct order_long_test_case *params = test->param_value;
117*4101b3b5SRyota Sakamoto 
118*4101b3b5SRyota Sakamoto 	KUNIT_EXPECT_EQ(test, get_count_order_long(params->count), params->expected);
119*4101b3b5SRyota Sakamoto }
120*4101b3b5SRyota Sakamoto #endif
121*4101b3b5SRyota Sakamoto 
122*4101b3b5SRyota Sakamoto static struct kunit_case bitops_test_cases[] = {
123*4101b3b5SRyota Sakamoto 	KUNIT_CASE_PARAM(test_set_bit_clear_bit, bitops_gen_params),
124*4101b3b5SRyota Sakamoto 	KUNIT_CASE_PARAM(test_get_count_order, order_gen_params),
125*4101b3b5SRyota Sakamoto #ifdef CONFIG_64BIT
126*4101b3b5SRyota Sakamoto 	KUNIT_CASE_PARAM(test_get_count_order_long, order_long_gen_params),
127*4101b3b5SRyota Sakamoto #endif
128*4101b3b5SRyota Sakamoto 	{},
129*4101b3b5SRyota Sakamoto };
130*4101b3b5SRyota Sakamoto 
131*4101b3b5SRyota Sakamoto static struct kunit_suite bitops_test_suite = {
132*4101b3b5SRyota Sakamoto 	.name = "bitops",
133*4101b3b5SRyota Sakamoto 	.test_cases = bitops_test_cases,
134*4101b3b5SRyota Sakamoto };
135*4101b3b5SRyota Sakamoto 
136*4101b3b5SRyota Sakamoto kunit_test_suite(bitops_test_suite);
137*4101b3b5SRyota Sakamoto 
138*4101b3b5SRyota Sakamoto MODULE_AUTHOR("Jesse Brandeburg <jesse.brandeburg@intel.com>");
139*4101b3b5SRyota Sakamoto MODULE_AUTHOR("Wei Yang <richard.weiyang@gmail.com>");
140*4101b3b5SRyota Sakamoto MODULE_AUTHOR("Ryota Sakamoto <sakamo.ryota@gmail.com>");
141*4101b3b5SRyota Sakamoto MODULE_LICENSE("GPL");
142*4101b3b5SRyota Sakamoto MODULE_DESCRIPTION("Bit testing module");
143