1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* Unit tests for IIO formatting functions |
3 | * |
4 | * Copyright (c) 2020 Lars-Peter Clausen <lars@metafoo.de> |
5 | */ |
6 | |
7 | #include <kunit/test.h> |
8 | #include <linux/iio/iio.h> |
9 | |
10 | #define IIO_TEST_FORMAT_EXPECT_EQ(_test, _buf, _ret, _val) do { \ |
11 | KUNIT_EXPECT_EQ(_test, strlen(_buf), _ret); \ |
12 | KUNIT_EXPECT_STREQ(_test, (_buf), (_val)); \ |
13 | } while (0) |
14 | |
15 | static void iio_test_iio_format_value_integer(struct kunit *test) |
16 | { |
17 | char *buf; |
18 | int val; |
19 | int ret; |
20 | |
21 | buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); |
22 | KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); |
23 | |
24 | val = 42; |
25 | ret = iio_format_value(buf, IIO_VAL_INT, size: 1, vals: &val); |
26 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "42\n" ); |
27 | |
28 | val = -23; |
29 | ret = iio_format_value(buf, IIO_VAL_INT, size: 1, vals: &val); |
30 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-23\n" ); |
31 | |
32 | val = 0; |
33 | ret = iio_format_value(buf, IIO_VAL_INT, size: 1, vals: &val); |
34 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n" ); |
35 | |
36 | val = INT_MAX; |
37 | ret = iio_format_value(buf, IIO_VAL_INT, size: 1, vals: &val); |
38 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "2147483647\n" ); |
39 | |
40 | val = INT_MIN; |
41 | ret = iio_format_value(buf, IIO_VAL_INT, size: 1, vals: &val); |
42 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-2147483648\n" ); |
43 | } |
44 | |
45 | static void iio_test_iio_format_value_fixedpoint(struct kunit *test) |
46 | { |
47 | int values[2]; |
48 | char *buf; |
49 | int ret; |
50 | |
51 | buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); |
52 | KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); |
53 | |
54 | /* positive >= 1 */ |
55 | values[0] = 1; |
56 | values[1] = 10; |
57 | |
58 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), vals: values); |
59 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000010\n" ); |
60 | |
61 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), vals: values); |
62 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000010 dB\n" ); |
63 | |
64 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), vals: values); |
65 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000000010\n" ); |
66 | |
67 | /* positive < 1 */ |
68 | values[0] = 0; |
69 | values[1] = 12; |
70 | |
71 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), vals: values); |
72 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000012\n" ); |
73 | |
74 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), vals: values); |
75 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000012 dB\n" ); |
76 | |
77 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), vals: values); |
78 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000012\n" ); |
79 | |
80 | /* negative <= -1 */ |
81 | values[0] = -1; |
82 | values[1] = 10; |
83 | |
84 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), vals: values); |
85 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000010\n" ); |
86 | |
87 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), vals: values); |
88 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000010 dB\n" ); |
89 | |
90 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), vals: values); |
91 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000000010\n" ); |
92 | |
93 | /* negative > -1 */ |
94 | values[0] = 0; |
95 | values[1] = -123; |
96 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), vals: values); |
97 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000123\n" ); |
98 | |
99 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), vals: values); |
100 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000123 dB\n" ); |
101 | |
102 | ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), vals: values); |
103 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000000123\n" ); |
104 | } |
105 | |
106 | static void iio_test_iio_format_value_fractional(struct kunit *test) |
107 | { |
108 | int values[2]; |
109 | char *buf; |
110 | int ret; |
111 | |
112 | buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); |
113 | KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); |
114 | |
115 | /* positive < 1 */ |
116 | values[0] = 1; |
117 | values[1] = 10; |
118 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), vals: values); |
119 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.100000000\n" ); |
120 | |
121 | /* positive >= 1 */ |
122 | values[0] = 100; |
123 | values[1] = 3; |
124 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), vals: values); |
125 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "33.333333333\n" ); |
126 | |
127 | /* negative > -1 */ |
128 | values[0] = -1; |
129 | values[1] = 1000000000; |
130 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), vals: values); |
131 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000000001\n" ); |
132 | |
133 | /* negative <= -1 */ |
134 | values[0] = -200; |
135 | values[1] = 3; |
136 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), vals: values); |
137 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-66.666666666\n" ); |
138 | |
139 | /* Zero */ |
140 | values[0] = 0; |
141 | values[1] = -10; |
142 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), vals: values); |
143 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000000\n" ); |
144 | } |
145 | |
146 | static void iio_test_iio_format_value_fractional_log2(struct kunit *test) |
147 | { |
148 | int values[2]; |
149 | char *buf; |
150 | int ret; |
151 | |
152 | buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); |
153 | KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); |
154 | |
155 | /* positive < 1 */ |
156 | values[0] = 123; |
157 | values[1] = 10; |
158 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), vals: values); |
159 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.120117187\n" ); |
160 | |
161 | /* positive >= 1 */ |
162 | values[0] = 1234567; |
163 | values[1] = 10; |
164 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), vals: values); |
165 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1205.631835937\n" ); |
166 | |
167 | /* negative > -1 */ |
168 | values[0] = -123; |
169 | values[1] = 10; |
170 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), vals: values); |
171 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.120117187\n" ); |
172 | |
173 | /* negative <= -1 */ |
174 | values[0] = -1234567; |
175 | values[1] = 10; |
176 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), vals: values); |
177 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1205.631835937\n" ); |
178 | |
179 | /* Zero */ |
180 | values[0] = 0; |
181 | values[1] = 10; |
182 | ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), vals: values); |
183 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000000\n" ); |
184 | } |
185 | |
186 | static void iio_test_iio_format_value_multiple(struct kunit *test) |
187 | { |
188 | int values[] = {1, -2, 3, -4, 5}; |
189 | char *buf; |
190 | int ret; |
191 | |
192 | buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); |
193 | KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); |
194 | |
195 | ret = iio_format_value(buf, IIO_VAL_INT_MULTIPLE, |
196 | ARRAY_SIZE(values), vals: values); |
197 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1 -2 3 -4 5 \n" ); |
198 | } |
199 | |
200 | static void iio_test_iio_format_value_integer_64(struct kunit *test) |
201 | { |
202 | int values[2]; |
203 | s64 value; |
204 | char *buf; |
205 | int ret; |
206 | |
207 | buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); |
208 | KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); |
209 | |
210 | value = 24; |
211 | values[0] = lower_32_bits(value); |
212 | values[1] = upper_32_bits(value); |
213 | ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), vals: values); |
214 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "24\n" ); |
215 | |
216 | value = -24; |
217 | values[0] = lower_32_bits(value); |
218 | values[1] = upper_32_bits(value); |
219 | ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), vals: values); |
220 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-24\n" ); |
221 | |
222 | value = 0; |
223 | values[0] = lower_32_bits(value); |
224 | values[1] = upper_32_bits(value); |
225 | ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), vals: values); |
226 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n" ); |
227 | |
228 | value = UINT_MAX; |
229 | values[0] = lower_32_bits(value); |
230 | values[1] = upper_32_bits(value); |
231 | ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), vals: values); |
232 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "4294967295\n" ); |
233 | |
234 | value = -((s64)UINT_MAX); |
235 | values[0] = lower_32_bits(value); |
236 | values[1] = upper_32_bits(value); |
237 | ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), vals: values); |
238 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-4294967295\n" ); |
239 | |
240 | value = LLONG_MAX; |
241 | values[0] = lower_32_bits(value); |
242 | values[1] = upper_32_bits(value); |
243 | ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), vals: values); |
244 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036854775807\n" ); |
245 | |
246 | value = LLONG_MIN; |
247 | values[0] = lower_32_bits(value); |
248 | values[1] = upper_32_bits(value); |
249 | ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), vals: values); |
250 | IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036854775808\n" ); |
251 | } |
252 | |
253 | static struct kunit_case iio_format_test_cases[] = { |
254 | KUNIT_CASE(iio_test_iio_format_value_integer), |
255 | KUNIT_CASE(iio_test_iio_format_value_fixedpoint), |
256 | KUNIT_CASE(iio_test_iio_format_value_fractional), |
257 | KUNIT_CASE(iio_test_iio_format_value_fractional_log2), |
258 | KUNIT_CASE(iio_test_iio_format_value_multiple), |
259 | KUNIT_CASE(iio_test_iio_format_value_integer_64), |
260 | {} |
261 | }; |
262 | |
263 | static struct kunit_suite iio_format_test_suite = { |
264 | .name = "iio-format" , |
265 | .test_cases = iio_format_test_cases, |
266 | }; |
267 | kunit_test_suite(iio_format_test_suite); |
268 | |
269 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>" ); |
270 | MODULE_DESCRIPTION("Test IIO formatting functions" ); |
271 | MODULE_LICENSE("GPL v2" ); |
272 | |