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, 1, &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, 1, &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, 1, &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, 1, &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, 1, &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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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), 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 char *buf; 204 int ret; 205 206 buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); 207 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); 208 209 iio_val_s64_decompose(24, &values[0], &values[1]); 210 ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values); 211 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "24\n"); 212 213 iio_val_s64_decompose(-24, &values[0], &values[1]); 214 ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values); 215 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-24\n"); 216 217 iio_val_s64_decompose(0, &values[0], &values[1]); 218 ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values); 219 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n"); 220 221 iio_val_s64_decompose(UINT_MAX, &values[0], &values[1]); 222 ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values); 223 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "4294967295\n"); 224 225 iio_val_s64_decompose(-((s64)UINT_MAX), &values[0], &values[1]); 226 ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values); 227 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-4294967295\n"); 228 229 iio_val_s64_decompose(LLONG_MAX, &values[0], &values[1]); 230 ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values); 231 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036854775807\n"); 232 233 iio_val_s64_decompose(LLONG_MIN, &values[0], &values[1]); 234 ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values); 235 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036854775808\n"); 236 } 237 238 static void iio_test_iio_format_value_decimal_64(struct kunit *test) 239 { 240 int values[2]; 241 char *buf; 242 int ret; 243 244 buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL); 245 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf); 246 247 /* DECIMAL64_MILLI: positive >= 1, value 1.234 */ 248 iio_val_s64_decompose(1234, &values[0], &values[1]); 249 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values); 250 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.234\n"); 251 252 /* DECIMAL64_MICRO: positive >= 1, value 3.141592 */ 253 iio_val_s64_decompose(3141592, &values[0], &values[1]); 254 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values); 255 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "3.141592\n"); 256 257 /* DECIMAL64_MILLI: positive < 1, value 0.042 */ 258 iio_val_s64_decompose(42, &values[0], &values[1]); 259 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values); 260 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.042\n"); 261 262 /* DECIMAL64_MILLI: negative <= -1, value -1.234 */ 263 iio_val_s64_decompose(-1234, &values[0], &values[1]); 264 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values); 265 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.234\n"); 266 267 /* DECIMAL64_MILLI: negative > -1, value -0.123 */ 268 iio_val_s64_decompose(-123, &values[0], &values[1]); 269 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values); 270 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.123\n"); 271 272 /* DECIMAL64_MILLI: zero */ 273 iio_val_s64_decompose(0, &values[0], &values[1]); 274 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MILLI, ARRAY_SIZE(values), values); 275 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000\n"); 276 277 /* DECIMAL64_NANO: value 1.000000001 */ 278 iio_val_s64_decompose(1000000001, &values[0], &values[1]); 279 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_NANO, ARRAY_SIZE(values), values); 280 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000000001\n"); 281 282 /* DECIMAL64_MICRO: large value using upper 32 bits */ 283 iio_val_s64_decompose(5000000000000042LL, &values[0], &values[1]); 284 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values); 285 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "5000000000.000042\n"); 286 287 /* limits */ 288 iio_val_s64_decompose(LLONG_MAX, &values[0], &values[1]); 289 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_PICO, ARRAY_SIZE(values), values); 290 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372.036854775807\n"); 291 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_NANO, ARRAY_SIZE(values), values); 292 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036.854775807\n"); 293 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values); 294 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036854.775807\n"); 295 296 iio_val_s64_decompose(LLONG_MIN, &values[0], &values[1]); 297 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_PICO, ARRAY_SIZE(values), values); 298 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372.036854775808\n"); 299 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_NANO, ARRAY_SIZE(values), values); 300 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036.854775808\n"); 301 ret = iio_format_value(buf, IIO_VAL_DECIMAL64_MICRO, ARRAY_SIZE(values), values); 302 IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036854.775808\n"); 303 } 304 305 static struct kunit_case iio_format_test_cases[] = { 306 KUNIT_CASE(iio_test_iio_format_value_integer), 307 KUNIT_CASE(iio_test_iio_format_value_fixedpoint), 308 KUNIT_CASE(iio_test_iio_format_value_fractional), 309 KUNIT_CASE(iio_test_iio_format_value_fractional_log2), 310 KUNIT_CASE(iio_test_iio_format_value_multiple), 311 KUNIT_CASE(iio_test_iio_format_value_integer_64), 312 KUNIT_CASE(iio_test_iio_format_value_decimal_64), 313 { } 314 }; 315 316 static struct kunit_suite iio_format_test_suite = { 317 .name = "iio-format", 318 .test_cases = iio_format_test_cases, 319 }; 320 kunit_test_suite(iio_format_test_suite); 321 322 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 323 MODULE_DESCRIPTION("Test IIO formatting functions"); 324 MODULE_LICENSE("GPL v2"); 325