1 // SPDX-License-Identifier: GPL-2.0-only
3 * Test cases for string functions.
6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8 #include <kunit/test.h>
9 #include <linux/module.h>
10 #include <linux/printk.h>
11 #include <linux/slab.h>
12 #include <linux/string.h>
14 static void test_memset16(struct kunit *test)
19 p = kunit_kzalloc(test, 256 * 2 * 2, GFP_KERNEL);
20 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p);
22 for (i = 0; i < 256; i++) {
23 for (j = 0; j < 256; j++) {
24 memset(p, 0xa1, 256 * 2 * sizeof(v));
25 memset16(p + i, 0xb1b2, j);
26 for (k = 0; k < 512; k++) {
29 KUNIT_ASSERT_EQ_MSG(test, v, 0xa1a1,
30 "i:%d j:%d k:%d", i, j, k);
31 } else if (k < i + j) {
32 KUNIT_ASSERT_EQ_MSG(test, v, 0xb1b2,
33 "i:%d j:%d k:%d", i, j, k);
35 KUNIT_ASSERT_EQ_MSG(test, v, 0xa1a1,
36 "i:%d j:%d k:%d", i, j, k);
43 static void test_memset32(struct kunit *test)
48 p = kunit_kzalloc(test, 256 * 2 * 4, GFP_KERNEL);
49 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p);
51 for (i = 0; i < 256; i++) {
52 for (j = 0; j < 256; j++) {
53 memset(p, 0xa1, 256 * 2 * sizeof(v));
54 memset32(p + i, 0xb1b2b3b4, j);
55 for (k = 0; k < 512; k++) {
58 KUNIT_ASSERT_EQ_MSG(test, v, 0xa1a1a1a1,
59 "i:%d j:%d k:%d", i, j, k);
60 } else if (k < i + j) {
61 KUNIT_ASSERT_EQ_MSG(test, v, 0xb1b2b3b4,
62 "i:%d j:%d k:%d", i, j, k);
64 KUNIT_ASSERT_EQ_MSG(test, v, 0xa1a1a1a1,
65 "i:%d j:%d k:%d", i, j, k);
72 static void test_memset64(struct kunit *test)
77 p = kunit_kzalloc(test, 256 * 2 * 8, GFP_KERNEL);
78 KUNIT_ASSERT_NOT_ERR_OR_NULL(test, p);
80 for (i = 0; i < 256; i++) {
81 for (j = 0; j < 256; j++) {
82 memset(p, 0xa1, 256 * 2 * sizeof(v));
83 memset64(p + i, 0xb1b2b3b4b5b6b7b8ULL, j);
84 for (k = 0; k < 512; k++) {
87 KUNIT_ASSERT_EQ_MSG(test, v, 0xa1a1a1a1a1a1a1a1ULL,
88 "i:%d j:%d k:%d", i, j, k);
89 } else if (k < i + j) {
90 KUNIT_ASSERT_EQ_MSG(test, v, 0xb1b2b3b4b5b6b7b8ULL,
91 "i:%d j:%d k:%d", i, j, k);
93 KUNIT_ASSERT_EQ_MSG(test, v, 0xa1a1a1a1a1a1a1a1ULL,
94 "i:%d j:%d k:%d", i, j, k);
101 static void test_strchr(struct kunit *test)
103 const char *test_string = "abcdefghijkl";
104 const char *empty_string = "";
108 for (i = 0; i < strlen(test_string) + 1; i++) {
109 result = strchr(test_string, test_string[i]);
110 KUNIT_ASSERT_EQ_MSG(test, result - test_string, i,
114 result = strchr(empty_string, '\0');
115 KUNIT_ASSERT_PTR_EQ(test, result, empty_string);
117 result = strchr(empty_string, 'a');
118 KUNIT_ASSERT_NULL(test, result);
120 result = strchr(test_string, 'z');
121 KUNIT_ASSERT_NULL(test, result);
124 static void test_strnchr(struct kunit *test)
126 const char *test_string = "abcdefghijkl";
127 const char *empty_string = "";
131 for (i = 0; i < strlen(test_string) + 1; i++) {
132 for (j = 0; j < strlen(test_string) + 2; j++) {
133 result = strnchr(test_string, j, test_string[i]);
135 KUNIT_ASSERT_NULL_MSG(test, result,
136 "char:%c i:%d j:%d", 'a' + i, i, j);
138 KUNIT_ASSERT_EQ_MSG(test, result - test_string, i,
139 "char:%c i:%d j:%d", 'a' + i, i, j);
144 result = strnchr(empty_string, 0, '\0');
145 KUNIT_ASSERT_NULL(test, result);
147 result = strnchr(empty_string, 1, '\0');
148 KUNIT_ASSERT_PTR_EQ(test, result, empty_string);
150 result = strnchr(empty_string, 1, 'a');
151 KUNIT_ASSERT_NULL(test, result);
153 result = strnchr(NULL, 0, '\0');
154 KUNIT_ASSERT_NULL(test, result);
157 static void test_strspn(struct kunit *test)
159 static const struct strspn_test {
161 const char accept[16];
162 const char reject[16];
166 { "foobar", "", "", 0, 6 },
167 { "abba", "abc", "ABBA", 4, 4 },
168 { "abba", "a", "b", 1, 1 },
169 { "", "abc", "abc", 0, 0},
171 const struct strspn_test *s = tests;
174 for (i = 0; i < ARRAY_SIZE(tests); ++i, ++s) {
175 KUNIT_ASSERT_EQ_MSG(test, s->a, strspn(s->str, s->accept),
177 KUNIT_ASSERT_EQ_MSG(test, s->r, strcspn(s->str, s->reject),
182 static struct kunit_case string_test_cases[] = {
183 KUNIT_CASE(test_memset16),
184 KUNIT_CASE(test_memset32),
185 KUNIT_CASE(test_memset64),
186 KUNIT_CASE(test_strchr),
187 KUNIT_CASE(test_strnchr),
188 KUNIT_CASE(test_strspn),
192 static struct kunit_suite string_test_suite = {
194 .test_cases = string_test_cases,
197 kunit_test_suites(&string_test_suite);
199 MODULE_LICENSE("GPL v2");