Better late than never, now there is a long-awaited basic
test for 'memparse()' which is provided by cmdline.c.

Suggested-by: Andy Shevchenko <[email protected]>
Reviewed-by: Andy Shevchenko <[email protected]>
Signed-off-by: Dmitry Antipov <[email protected]>
---
v3: adjust style as suggested by Andy
v2: few more test cases to trigger overflows
---
 lib/tests/cmdline_kunit.c | 52 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/lib/tests/cmdline_kunit.c b/lib/tests/cmdline_kunit.c
index c1602f797637..3eda70487719 100644
--- a/lib/tests/cmdline_kunit.c
+++ b/lib/tests/cmdline_kunit.c
@@ -6,6 +6,7 @@
 #include <kunit/test.h>
 #include <linux/kernel.h>
 #include <linux/random.h>
+#include <linux/sizes.h>
 #include <linux/string.h>
 
 static const char *cmdline_test_strings[] = {
@@ -139,11 +140,62 @@ static void cmdline_test_range(struct kunit *test)
        } while (++i < ARRAY_SIZE(cmdline_test_range_strings));
 }
 
+struct cmdline_test_memparse_entry {
+       const char *input;
+       const char *unrecognized;
+       unsigned long long result;
+};
+
+static const struct cmdline_test_memparse_entry testdata[] = {
+       { "0",                          "",     0ULL },
+       { "1",                          "",     1ULL },
+       { "a",                          "a",    0ULL },
+       { "0xb",                        "",     11ULL },
+       { "0xz",                        "x",    0ULL },
+       { "1234",                       "",     1234ULL },
+       { "04567",                      "",     2423ULL },
+       { "0x9876",                     "",     39030LL },
+       { "05678",                      "8",    375ULL },
+       { "0xabcdefz",                  "z",    11259375ULL },
+       { "0cdba",                      "c",    0ULL },
+       { "4K",                         "",     SZ_4K },
+       { "0x10k@0xaaaabbbb",           "@",    SZ_16K },
+       { "32M",                        "",     SZ_32M },
+       { "067m:foo",                   ":",    55 * SZ_1M },
+       { "2G;bar=baz",                 ";",    SZ_2G },
+       { "07gz",                       "z",    7ULL * SZ_1G },
+       { "3T+data",                    "+",    3 * SZ_1T },
+       { "04t,ro",                     ",",    SZ_4T },
+       { "012p",                       "",     11258999068426240ULL },
+       { "7P,sync",                    ",",    7881299347898368ULL },
+       { "0x2e",                       "",     46ULL },
+       { "2E and more",                " ",    2305843009213693952ULL },
+       { "18446744073709551615",       "",     ULLONG_MAX },
+       { "18446744073709551616",       "",     ULLONG_MAX },
+       { "569202370375329612767",      "",     ULLONG_MAX },
+};
+
+static void cmdline_test_memparse(struct kunit *test)
+{
+       const struct cmdline_test_memparse_entry *e;
+       unsigned long long ret;
+       char *retptr;
+
+       for (e = testdata; e < testdata + ARRAY_SIZE(testdata); e++) {
+               ret = memparse(e->input, &retptr);
+               KUNIT_EXPECT_EQ_MSG(test, ret, e->result,
+                                   "    when parsing '%s'", e->input);
+               KUNIT_EXPECT_EQ_MSG(test, *retptr, *e->unrecognized,
+                                   "    when parsing '%s'", e->input);
+       }
+}
+
 static struct kunit_case cmdline_test_cases[] = {
        KUNIT_CASE(cmdline_test_noint),
        KUNIT_CASE(cmdline_test_lead_int),
        KUNIT_CASE(cmdline_test_tail_int),
        KUNIT_CASE(cmdline_test_range),
+       KUNIT_CASE(cmdline_test_memparse),
        {}
 };
 
-- 
2.52.0


Reply via email to