lib/cmdline_kunit: add a new test suite for cmdline API
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 16 Dec 2020 04:43:34 +0000 (20:43 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 16 Dec 2020 06:46:16 +0000 (22:46 -0800)
Test get_option() for a starter which is provided by cmdline.c.

[akpm@linux-foundation.org: fix warning by constifying cmdline_test_values]
[andriy.shevchenko@linux.intel.com: type of expected returned values should be int]
Link: https://lkml.kernel.org/r/20201116104244.15472-1-andriy.shevchenko@linux.intel.com
[andriy.shevchenko@linux.intel.com: provide meaningful MODULE_LICENSE()]
Link: https://lkml.kernel.org/r/20201116104257.15527-1-andriy.shevchenko@linux.intel.com
Link: https://lkml.kernel.org/r/20201112180732.75589-6-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Shuah Khan <skhan@linuxfoundation.org>
Cc: Vitor Massaru Iha <vitor@massaru.org>
Cc: Mark Brown <broonie@kernel.org>
Cc: Brendan Higgins <brendanhiggins@google.com>
Cc: David Gow <davidgow@google.com>
Cc: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/Kconfig.debug
lib/Makefile
lib/cmdline_kunit.c [new file with mode: 0644]

index 7c70521..7d7097c 100644 (file)
@@ -2311,6 +2311,17 @@ config LINEAR_RANGES_TEST
 
          If unsure, say N.
 
+config CMDLINE_KUNIT_TEST
+       tristate "KUnit test for cmdline API"
+       depends on KUNIT
+       help
+         This builds the cmdline API unit test.
+         Tests the logic of API provided by cmdline.c.
+         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 BITS_TEST
        tristate "KUnit test for bits.h"
        depends on KUNIT
index d415fc7..8598e87 100644 (file)
@@ -353,3 +353,4 @@ obj-$(CONFIG_BITFIELD_KUNIT) += bitfield_kunit.o
 obj-$(CONFIG_LIST_KUNIT_TEST) += list-test.o
 obj-$(CONFIG_LINEAR_RANGES_TEST) += test_linear_ranges.o
 obj-$(CONFIG_BITS_TEST) += test_bits.o
+obj-$(CONFIG_CMDLINE_KUNIT_TEST) += cmdline_kunit.o
diff --git a/lib/cmdline_kunit.c b/lib/cmdline_kunit.c
new file mode 100644 (file)
index 0000000..550e7a4
--- /dev/null
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Test cases for API provided by cmdline.c
+ */
+
+#include <kunit/test.h>
+#include <linux/kernel.h>
+#include <linux/random.h>
+#include <linux/string.h>
+
+static const char *cmdline_test_strings[] = {
+       "\"\"", ""  , "=" , "\"-", ","    , "-,"   , ",-"   , "-" ,
+       "+,"  , "--", ",,", "''" , "\"\",", "\",\"", "-\"\"", "\"",
+};
+
+static const int cmdline_test_values[] = {
+       1, 1, 1, 1, 2, 3, 2, 3,
+       1, 3, 2, 1, 1, 1, 3, 1,
+};
+
+static void cmdline_do_one_test(struct kunit *test, const char *in, int rc, int offset)
+{
+       const char *fmt = "Pattern: %s";
+       const char *out = in;
+       int dummy;
+       int ret;
+
+       ret = get_option((char **)&out, &dummy);
+
+       KUNIT_EXPECT_EQ_MSG(test, ret, rc, fmt, in);
+       KUNIT_EXPECT_PTR_EQ_MSG(test, out, in + offset, fmt, in);
+}
+
+static void cmdline_test_noint(struct kunit *test)
+{
+       unsigned int i = 0;
+
+       do {
+               const char *str = cmdline_test_strings[i];
+               int rc = 0;
+               int offset;
+
+               /* Only first and leading '-' will advance the pointer */
+               offset = !!(*str == '-');
+               cmdline_do_one_test(test, str, rc, offset);
+       } while (++i < ARRAY_SIZE(cmdline_test_strings));
+}
+
+static void cmdline_test_lead_int(struct kunit *test)
+{
+       unsigned int i = 0;
+       char in[32];
+
+       do {
+               const char *str = cmdline_test_strings[i];
+               int rc = cmdline_test_values[i];
+               int offset;
+
+               sprintf(in, "%u%s", get_random_int() % 256, str);
+               /* Only first '-' after the number will advance the pointer */
+               offset = strlen(in) - strlen(str) + !!(rc == 2);
+               cmdline_do_one_test(test, in, rc, offset);
+       } while (++i < ARRAY_SIZE(cmdline_test_strings));
+}
+
+static void cmdline_test_tail_int(struct kunit *test)
+{
+       unsigned int i = 0;
+       char in[32];
+
+       do {
+               const char *str = cmdline_test_strings[i];
+               /* When "" or "-" the result will be valid integer */
+               int rc = strcmp(str, "") ? (strcmp(str, "-") ? 0 : 1) : 1;
+               int offset;
+
+               sprintf(in, "%s%u", str, get_random_int() % 256);
+               /*
+                * Only first and leading '-' not followed by integer
+                * will advance the pointer.
+                */
+               offset = rc ? strlen(in) : !!(*str == '-');
+               cmdline_do_one_test(test, in, rc, offset);
+       } while (++i < ARRAY_SIZE(cmdline_test_strings));
+}
+
+static struct kunit_case cmdline_test_cases[] = {
+       KUNIT_CASE(cmdline_test_noint),
+       KUNIT_CASE(cmdline_test_lead_int),
+       KUNIT_CASE(cmdline_test_tail_int),
+       {}
+};
+
+static struct kunit_suite cmdline_test_suite = {
+       .name = "cmdline",
+       .test_cases = cmdline_test_cases,
+};
+kunit_test_suite(cmdline_test_suite);
+
+MODULE_LICENSE("GPL");