summaryrefslogtreecommitdiff
path: root/drivers/iio/test
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iio/test')
-rw-r--r--drivers/iio/test/Kconfig13
-rw-r--r--drivers/iio/test/Makefile1
-rw-r--r--drivers/iio/test/iio-test-channel-prefix.c307
-rw-r--r--drivers/iio/test/iio-test-rescale.c4
4 files changed, 323 insertions, 2 deletions
diff --git a/drivers/iio/test/Kconfig b/drivers/iio/test/Kconfig
index 4fc17dd0dcd7..04930b4fdd5d 100644
--- a/drivers/iio/test/Kconfig
+++ b/drivers/iio/test/Kconfig
@@ -4,6 +4,19 @@
#
# Keep in alphabetical order
+config IIO_CHANNEL_PREFIX_KUNIT_TEST
+ tristate "Test IIO channel prefix" if !KUNIT_ALL_TESTS
+ depends on KUNIT && IIO
+ default KUNIT_ALL_TESTS
+ help
+ Build unit tests for __iio_chan_prefix_emit(), the helper that
+ builds IIO sysfs attribute name prefixes from an iio_chan_spec.
+
+ For more information on KUnit and unit tests in general, please refer
+ to the KUnit documentation in Documentation/dev-tools/kunit/.
+
+ If unsure, say N.
+
config IIO_GTS_KUNIT_TEST
tristate "Test IIO gain-time-scale helpers" if !KUNIT_ALL_TESTS
depends on KUNIT
diff --git a/drivers/iio/test/Makefile b/drivers/iio/test/Makefile
index 0c846bc21acd..ba08afa7f3f2 100644
--- a/drivers/iio/test/Makefile
+++ b/drivers/iio/test/Makefile
@@ -4,6 +4,7 @@
#
# Keep in alphabetical order
+obj-$(CONFIG_IIO_CHANNEL_PREFIX_KUNIT_TEST) += iio-test-channel-prefix.o
obj-$(CONFIG_IIO_RESCALE_KUNIT_TEST) += iio-test-rescale.o
obj-$(CONFIG_IIO_FORMAT_KUNIT_TEST) += iio-test-format.o
obj-$(CONFIG_IIO_GTS_KUNIT_TEST) += iio-test-gts.o
diff --git a/drivers/iio/test/iio-test-channel-prefix.c b/drivers/iio/test/iio-test-channel-prefix.c
new file mode 100644
index 000000000000..44c838fcd8d6
--- /dev/null
+++ b/drivers/iio/test/iio-test-channel-prefix.c
@@ -0,0 +1,307 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Unit tests for IIO channel prefix generation.
+ */
+
+#include <kunit/test.h>
+#include <kunit/visibility.h>
+
+#include <linux/iio/iio.h>
+#include <linux/limits.h>
+#include <linux/string.h>
+
+#include "../iio_core.h"
+
+#define PREFIX_BUF_SIZE (NAME_MAX + 1)
+
+#define EXPECT_PREFIX(_test, _buf, _ret, _expected) do { \
+ struct kunit *__test = (_test); \
+ const char *__expected = (_expected); \
+ \
+ KUNIT_EXPECT_EQ(__test, (_ret), (ssize_t)strlen(__expected)); \
+ KUNIT_EXPECT_STREQ(__test, (_buf), __expected); \
+ } while (0)
+
+static char *iio_test_prefix_alloc(struct kunit *test)
+{
+ char *buf = kunit_kzalloc(test, PREFIX_BUF_SIZE, GFP_KERNEL);
+
+ KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buf);
+ return buf;
+}
+
+static void iio_test_prefix_shared_by_all(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ };
+ const struct iio_chan_spec chan_noisy = {
+ .type = IIO_ACCEL,
+ .output = 1,
+ .indexed = 1,
+ .modified = 1,
+ .channel = 7,
+ .channel2 = IIO_MOD_Z,
+ .extend_name = "supply",
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SHARED_BY_ALL,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "");
+
+ ret = __iio_chan_prefix_emit(NULL, &chan_noisy, IIO_SHARED_BY_ALL,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "");
+}
+
+static void iio_test_prefix_shared_by_dir(struct kunit *test)
+{
+ const struct iio_chan_spec chan_in = {
+ .type = IIO_VOLTAGE,
+ .output = 0,
+ };
+ const struct iio_chan_spec chan_out = {
+ .type = IIO_VOLTAGE,
+ .output = 1,
+ };
+ const struct iio_chan_spec chan_in_noisy = {
+ .type = IIO_ACCEL,
+ .indexed = 1,
+ .modified = 1,
+ .channel = 5,
+ .channel2 = IIO_MOD_Y,
+ .extend_name = "supply",
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan_in, IIO_SHARED_BY_DIR,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in");
+
+ ret = __iio_chan_prefix_emit(NULL, &chan_out, IIO_SHARED_BY_DIR,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "out");
+
+ ret = __iio_chan_prefix_emit(NULL, &chan_in_noisy, IIO_SHARED_BY_DIR,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in");
+}
+
+static void iio_test_prefix_shared_by_type(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ };
+ const struct iio_chan_spec chan_diff = {
+ .type = IIO_VOLTAGE,
+ .differential = 1,
+ };
+ const struct iio_chan_spec chan_noisy = {
+ .type = IIO_VOLTAGE,
+ .indexed = 1,
+ .modified = 1,
+ .channel = 4,
+ .channel2 = IIO_MOD_X,
+ .extend_name = "supply",
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SHARED_BY_TYPE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_voltage");
+
+ ret = __iio_chan_prefix_emit(NULL, &chan_diff, IIO_SHARED_BY_TYPE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_voltage-voltage");
+
+ ret = __iio_chan_prefix_emit(NULL, &chan_noisy, IIO_SHARED_BY_TYPE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_voltage");
+}
+
+static void iio_test_prefix_separate_simple(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_TEMP,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_temp");
+}
+
+static void iio_test_prefix_separate_indexed(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ .indexed = 1,
+ .channel = 3,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_voltage3");
+}
+
+static void iio_test_prefix_separate_indexed_diff(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ .indexed = 1,
+ .differential = 1,
+ .channel = 0,
+ .channel2 = 1,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_voltage0-voltage1");
+}
+
+static void iio_test_prefix_separate_modified(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_ACCEL,
+ .modified = 1,
+ .channel2 = IIO_MOD_X,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_accel_x");
+}
+
+static void iio_test_prefix_separate_indexed_modified(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_ACCEL,
+ .indexed = 1,
+ .modified = 1,
+ .channel = 2,
+ .channel2 = IIO_MOD_Y,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_accel2_y");
+}
+
+static void iio_test_prefix_separate_extend_name(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ .indexed = 1,
+ .channel = 2,
+ .extend_name = "supply",
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "in_voltage2_supply");
+}
+
+static void iio_test_prefix_output_separate(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ .output = 1,
+ .indexed = 1,
+ .channel = 0,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ EXPECT_PREFIX(test, buf, ret, "out_voltage0");
+}
+
+static void iio_test_prefix_diff_unindexed_fails(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ .differential = 1,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ KUNIT_EXPECT_EQ(test, ret, -EINVAL);
+}
+
+static void iio_test_prefix_diff_modified_fails(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ .indexed = 1,
+ .differential = 1,
+ .modified = 1,
+ .channel = 0,
+ .channel2 = 1,
+ };
+ char *buf = iio_test_prefix_alloc(test);
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SEPARATE,
+ buf, PREFIX_BUF_SIZE);
+ KUNIT_EXPECT_EQ(test, ret, -EINVAL);
+}
+
+static void iio_test_prefix_overflow(struct kunit *test)
+{
+ const struct iio_chan_spec chan = {
+ .type = IIO_VOLTAGE,
+ };
+ char small[4];
+ ssize_t ret;
+
+ ret = __iio_chan_prefix_emit(NULL, &chan, IIO_SHARED_BY_TYPE,
+ small, sizeof(small));
+ KUNIT_EXPECT_EQ(test, ret, -EOVERFLOW);
+}
+
+static struct kunit_case iio_chan_prefix_test_cases[] = {
+ KUNIT_CASE(iio_test_prefix_shared_by_all),
+ KUNIT_CASE(iio_test_prefix_shared_by_dir),
+ KUNIT_CASE(iio_test_prefix_shared_by_type),
+ KUNIT_CASE(iio_test_prefix_separate_simple),
+ KUNIT_CASE(iio_test_prefix_separate_indexed),
+ KUNIT_CASE(iio_test_prefix_separate_indexed_diff),
+ KUNIT_CASE(iio_test_prefix_separate_modified),
+ KUNIT_CASE(iio_test_prefix_separate_indexed_modified),
+ KUNIT_CASE(iio_test_prefix_separate_extend_name),
+ KUNIT_CASE(iio_test_prefix_output_separate),
+ KUNIT_CASE(iio_test_prefix_diff_unindexed_fails),
+ KUNIT_CASE(iio_test_prefix_diff_modified_fails),
+ KUNIT_CASE(iio_test_prefix_overflow),
+ { }
+};
+
+static struct kunit_suite iio_channel_prefix_test_suite = {
+ .name = "iio-channel-prefix",
+ .test_cases = iio_chan_prefix_test_cases,
+};
+
+kunit_test_suite(iio_channel_prefix_test_suite);
+
+MODULE_AUTHOR("Rodrigo Alencar <rodrigo.alencar@analog.com>");
+MODULE_DESCRIPTION("Test IIO channel prefix generation");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
diff --git a/drivers/iio/test/iio-test-rescale.c b/drivers/iio/test/iio-test-rescale.c
index bcd4a607be19..de4a09f432c0 100644
--- a/drivers/iio/test/iio-test-rescale.c
+++ b/drivers/iio/test/iio-test-rescale.c
@@ -587,7 +587,7 @@ KUNIT_ARRAY_PARAM(iio_rescale_offset, offset_cases, case_to_desc);
* @str: The string to parse
* @nano: The number as an integer
*
- * Returns 0 on success, or a negative error code if the string cound not be
+ * Returns 0 on success, or a negative error code if the string could not be
* parsed.
*/
static int iio_str_to_nano(const char *str, s64 *nano)
@@ -617,7 +617,7 @@ static int iio_str_to_nano(const char *str, s64 *nano)
* @real_str: The real value as a string
* @exp_str: The expected value as a string
*
- * Returns a negative error code if the strings cound not be parsed, or the
+ * Returns a negative error code if the strings could not be parsed, or the
* relative error in parts-per-million.
*/
static int iio_test_relative_error_ppm(const char *real_str, const char *exp_str)