Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /* Unit tests for IIO formatting functions
0003  *
0004  * Copyright (c) 2020 Lars-Peter Clausen <lars@metafoo.de>
0005  */
0006 
0007 #include <kunit/test.h>
0008 #include <linux/iio/iio.h>
0009 
0010 #define IIO_TEST_FORMAT_EXPECT_EQ(_test, _buf, _ret, _val) do { \
0011         KUNIT_EXPECT_EQ(_test, strlen(_buf), _ret); \
0012         KUNIT_EXPECT_STREQ(_test, (_buf), (_val)); \
0013     } while (0)
0014 
0015 static void iio_test_iio_format_value_integer(struct kunit *test)
0016 {
0017     char *buf;
0018     int val;
0019     int ret;
0020 
0021     buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
0022     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
0023 
0024     val = 42;
0025     ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
0026     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "42\n");
0027 
0028     val = -23;
0029     ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
0030     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-23\n");
0031 
0032     val = 0;
0033     ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
0034     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n");
0035 
0036     val = INT_MAX;
0037     ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
0038     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "2147483647\n");
0039 
0040     val = INT_MIN;
0041     ret = iio_format_value(buf, IIO_VAL_INT, 1, &val);
0042     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-2147483648\n");
0043 }
0044 
0045 static void iio_test_iio_format_value_fixedpoint(struct kunit *test)
0046 {
0047     int values[2];
0048     char *buf;
0049     int ret;
0050 
0051     buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
0052     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
0053 
0054     /* positive >= 1 */
0055     values[0] = 1;
0056     values[1] = 10;
0057 
0058     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
0059     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000010\n");
0060 
0061     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
0062     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000010 dB\n");
0063 
0064     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
0065     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1.000000010\n");
0066 
0067     /* positive < 1 */
0068     values[0] = 0;
0069     values[1] = 12;
0070 
0071     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
0072     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000012\n");
0073 
0074     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
0075     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000012 dB\n");
0076 
0077     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
0078     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000012\n");
0079 
0080     /* negative <= -1 */
0081     values[0] = -1;
0082     values[1] = 10;
0083 
0084     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
0085     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000010\n");
0086 
0087     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
0088     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000010 dB\n");
0089 
0090     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
0091     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1.000000010\n");
0092 
0093     /* negative > -1 */
0094     values[0] = 0;
0095     values[1] = -123;
0096     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO, ARRAY_SIZE(values), values);
0097     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000123\n");
0098 
0099     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_MICRO_DB, ARRAY_SIZE(values), values);
0100     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000123 dB\n");
0101 
0102     ret = iio_format_value(buf, IIO_VAL_INT_PLUS_NANO, ARRAY_SIZE(values), values);
0103     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000000123\n");
0104 }
0105 
0106 static void iio_test_iio_format_value_fractional(struct kunit *test)
0107 {
0108     int values[2];
0109     char *buf;
0110     int ret;
0111 
0112     buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
0113     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
0114 
0115     /* positive < 1 */
0116     values[0] = 1;
0117     values[1] = 10;
0118     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
0119     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.100000000\n");
0120 
0121     /* positive >= 1 */
0122     values[0] = 100;
0123     values[1] = 3;
0124     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
0125     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "33.333333333\n");
0126 
0127     /* negative > -1 */
0128     values[0] = -1;
0129     values[1] = 1000000000;
0130     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
0131     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.000000001\n");
0132 
0133     /* negative <= -1 */
0134     values[0] = -200;
0135     values[1] = 3;
0136     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
0137     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-66.666666666\n");
0138 
0139     /* Zero */
0140     values[0] = 0;
0141     values[1] = -10;
0142     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL, ARRAY_SIZE(values), values);
0143     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000000\n");
0144 }
0145 
0146 static void iio_test_iio_format_value_fractional_log2(struct kunit *test)
0147 {
0148     int values[2];
0149     char *buf;
0150     int ret;
0151 
0152     buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
0153     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
0154 
0155     /* positive < 1 */
0156     values[0] = 123;
0157     values[1] = 10;
0158     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
0159     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.120117187\n");
0160 
0161     /* positive >= 1 */
0162     values[0] = 1234567;
0163     values[1] = 10;
0164     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
0165     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1205.631835937\n");
0166 
0167     /* negative > -1 */
0168     values[0] = -123;
0169     values[1] = 10;
0170     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
0171     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-0.120117187\n");
0172 
0173     /* negative <= -1 */
0174     values[0] = -1234567;
0175     values[1] = 10;
0176     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
0177     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-1205.631835937\n");
0178 
0179     /* Zero */
0180     values[0] = 0;
0181     values[1] = 10;
0182     ret = iio_format_value(buf, IIO_VAL_FRACTIONAL_LOG2, ARRAY_SIZE(values), values);
0183     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0.000000000\n");
0184 }
0185 
0186 static void iio_test_iio_format_value_multiple(struct kunit *test)
0187 {
0188     int values[] = {1, -2, 3, -4, 5};
0189     char *buf;
0190     int ret;
0191 
0192     buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
0193     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
0194 
0195     ret = iio_format_value(buf, IIO_VAL_INT_MULTIPLE,
0196                    ARRAY_SIZE(values), values);
0197     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "1 -2 3 -4 5 \n");
0198 }
0199 
0200 static void iio_test_iio_format_value_integer_64(struct kunit *test)
0201 {
0202     int values[2];
0203     s64 value;
0204     char *buf;
0205     int ret;
0206 
0207     buf = kunit_kmalloc(test, PAGE_SIZE, GFP_KERNEL);
0208     KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
0209 
0210     value = 24;
0211     values[0] = lower_32_bits(value);
0212     values[1] = upper_32_bits(value);
0213     ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
0214     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "24\n");
0215 
0216     value = -24;
0217     values[0] = lower_32_bits(value);
0218     values[1] = upper_32_bits(value);
0219     ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
0220     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-24\n");
0221 
0222     value = 0;
0223     values[0] = lower_32_bits(value);
0224     values[1] = upper_32_bits(value);
0225     ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
0226     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "0\n");
0227 
0228     value = UINT_MAX;
0229     values[0] = lower_32_bits(value);
0230     values[1] = upper_32_bits(value);
0231     ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
0232     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "4294967295\n");
0233 
0234     value = -((s64)UINT_MAX);
0235     values[0] = lower_32_bits(value);
0236     values[1] = upper_32_bits(value);
0237     ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
0238     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-4294967295\n");
0239 
0240     value = LLONG_MAX;
0241     values[0] = lower_32_bits(value);
0242     values[1] = upper_32_bits(value);
0243     ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
0244     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "9223372036854775807\n");
0245 
0246     value = LLONG_MIN;
0247     values[0] = lower_32_bits(value);
0248     values[1] = upper_32_bits(value);
0249     ret = iio_format_value(buf, IIO_VAL_INT_64, ARRAY_SIZE(values), values);
0250     IIO_TEST_FORMAT_EXPECT_EQ(test, buf, ret, "-9223372036854775808\n");
0251 }
0252 
0253 static struct kunit_case iio_format_test_cases[] = {
0254         KUNIT_CASE(iio_test_iio_format_value_integer),
0255         KUNIT_CASE(iio_test_iio_format_value_fixedpoint),
0256         KUNIT_CASE(iio_test_iio_format_value_fractional),
0257         KUNIT_CASE(iio_test_iio_format_value_fractional_log2),
0258         KUNIT_CASE(iio_test_iio_format_value_multiple),
0259         KUNIT_CASE(iio_test_iio_format_value_integer_64),
0260         {}
0261 };
0262 
0263 static struct kunit_suite iio_format_test_suite = {
0264     .name = "iio-format",
0265     .test_cases = iio_format_test_cases,
0266 };
0267 kunit_test_suite(iio_format_test_suite);
0268 
0269 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
0270 MODULE_DESCRIPTION("Test IIO formatting functions");
0271 MODULE_LICENSE("GPL v2");