5
5
6
6
#define pr_fmt (fmt ) KBUILD_MODNAME ": " fmt
7
7
8
- #include <linux/kernel.h>
9
- #include <linux/module.h>
8
+ #include <kunit/test.h>
10
9
#include <linux/bitfield.h>
11
10
12
11
#define CHECK_ENC_GET_U (tp , v , field , res ) do { \
13
12
{ \
14
13
u##tp _res; \
15
14
\
16
15
_res = u##tp##_encode_bits(v, field); \
17
- if (_res != res) { \
18
- pr_warn("u" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != " #res "\n",\
19
- (u64)_res); \
20
- return -EINVAL; \
21
- } \
22
- if (u##tp##_get_bits(_res, field) != v) \
23
- return -EINVAL; \
16
+ KUNIT_ASSERT_FALSE_MSG(context, _res != res, \
17
+ "u" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != " #res "\n", \
18
+ (u64)_res); \
19
+ KUNIT_ASSERT_FALSE(context, \
20
+ u##tp##_get_bits(_res, field) != v); \
24
21
} \
25
22
} while (0)
26
23
29
26
__le##tp _res; \
30
27
\
31
28
_res = le##tp##_encode_bits(v, field); \
32
- if (_res != cpu_to_le##tp(res)) { \
33
- pr_warn("le" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != 0x%llx\n",\
34
- (u64)le##tp##_to_cpu(_res), \
35
- (u64)(res)); \
36
- return -EINVAL; \
37
- } \
38
- if (le##tp##_get_bits(_res, field) != v) \
39
- return -EINVAL; \
29
+ KUNIT_ASSERT_FALSE_MSG(context, \
30
+ _res != cpu_to_le##tp(res), \
31
+ "le" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != 0x%llx",\
32
+ (u64)le##tp##_to_cpu(_res), \
33
+ (u64)(res)); \
34
+ KUNIT_ASSERT_FALSE(context, \
35
+ le##tp##_get_bits(_res, field) != v);\
40
36
} \
41
37
} while (0)
42
38
45
41
__be##tp _res; \
46
42
\
47
43
_res = be##tp##_encode_bits(v, field); \
48
- if (_res != cpu_to_be##tp(res)) { \
49
- pr_warn("be" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != 0x%llx\n",\
50
- (u64)be##tp##_to_cpu(_res), \
51
- (u64)(res)); \
52
- return -EINVAL; \
53
- } \
54
- if (be##tp##_get_bits(_res, field) != v) \
55
- return -EINVAL; \
44
+ KUNIT_ASSERT_FALSE_MSG(context, \
45
+ _res != cpu_to_be##tp(res), \
46
+ "be" #tp "_encode_bits(" #v ", " #field ") is 0x%llx != 0x%llx", \
47
+ (u64)be##tp##_to_cpu(_res), \
48
+ (u64)(res)); \
49
+ KUNIT_ASSERT_FALSE(context, \
50
+ be##tp##_get_bits(_res, field) != v);\
56
51
} \
57
52
} while (0)
58
53
62
57
CHECK_ENC_GET_BE(tp, v, field, res); \
63
58
} while (0)
64
59
65
- static int test_constants ( void )
60
+ static void __init test_bitfields_constants ( struct kunit * context )
66
61
{
67
62
/*
68
63
* NOTE
@@ -95,19 +90,17 @@ static int test_constants(void)
95
90
CHECK_ENC_GET (64 , 7 , 0x00f0000000000000ull , 0x0070000000000000ull );
96
91
CHECK_ENC_GET (64 , 14 , 0x0f00000000000000ull , 0x0e00000000000000ull );
97
92
CHECK_ENC_GET (64 , 15 , 0xf000000000000000ull , 0xf000000000000000ull );
98
-
99
- return 0 ;
100
93
}
101
94
102
95
#define CHECK (tp , mask ) do { \
103
96
u64 v; \
104
97
\
105
98
for (v = 0; v < 1 << hweight32(mask); v++) \
106
- if (tp##_encode_bits(v, mask) != v << __ffs64(mask)) \
107
- return -EINVAL; \
99
+ KUNIT_ASSERT_FALSE(context, \
100
+ tp##_encode_bits(v, mask) != v << __ffs64(mask)); \
108
101
} while (0)
109
102
110
- static int test_variables ( void )
103
+ static void __init test_bitfields_variables ( struct kunit * context )
111
104
{
112
105
CHECK (u8 , 0x0f );
113
106
CHECK (u8 , 0xf0 );
@@ -130,39 +123,34 @@ static int test_variables(void)
130
123
CHECK (u64 , 0x000000007f000000ull );
131
124
CHECK (u64 , 0x0000000018000000ull );
132
125
CHECK (u64 , 0x0000001f8000000ull );
133
-
134
- return 0 ;
135
126
}
136
127
137
- static int __init test_bitfields (void )
138
- {
139
- int ret = test_constants ();
140
-
141
- if (ret ) {
142
- pr_warn ("constant tests failed!\n" );
143
- return ret ;
144
- }
145
-
146
- ret = test_variables ();
147
- if (ret ) {
148
- pr_warn ("variable tests failed!\n" );
149
- return ret ;
150
- }
151
128
152
- #ifdef TEST_BITFIELD_COMPILE
129
+ static void __init test_bitfields_compile (struct kunit * context )
130
+ {
153
131
/* these should fail compilation */
154
132
CHECK_ENC_GET (16 , 16 , 0x0f00 , 0x1000 );
155
133
u32_encode_bits (7 , 0x06000000 );
156
134
157
135
/* this should at least give a warning */
158
136
u16_encode_bits (0 , 0x60000 );
137
+ }
138
+
139
+ static struct kunit_case __refdata bitfields_test_cases [] = {
140
+ KUNIT_CASE (test_bitfields_constants ),
141
+ KUNIT_CASE (test_bitfields_variables ),
142
+ #ifdef TEST_BITFIELD_COMPILE
143
+ KUNIT_CASE (test_bitfields_compile ),
159
144
#endif
145
+ {}
146
+ };
160
147
161
- pr_info ("tests passed\n" );
148
+ static struct kunit_suite bitfields_test_suite = {
149
+ .name = "bitfields" ,
150
+ .test_cases = bitfields_test_cases ,
151
+ };
162
152
163
- return 0 ;
164
- }
165
- module_init (test_bitfields )
153
+ kunit_test_suites (& bitfields_test_suite );
166
154
167
155
MODULE_AUTHOR (
"Johannes Berg <[email protected] >" );
168
156
MODULE_LICENSE ("GPL" );
0 commit comments