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 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), 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), 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), 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), 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), 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), 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), 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