2 * Copyright (c) 2018 Benjamin Marzinski, Redhat
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
31 static void test_basenamecpy_good0(void **state)
35 assert_int_equal(basenamecpy("foobar", dst, sizeof(dst)), 6);
36 assert_string_equal(dst, "foobar");
39 static void test_basenamecpy_good1(void **state)
43 assert_int_equal(basenamecpy("foo/bar", dst, sizeof(dst)), 3);
44 assert_string_equal(dst, "bar");
47 static void test_basenamecpy_good2(void **state)
51 assert_int_equal(basenamecpy("/thud/blat", dst, sizeof(dst)), 4);
52 assert_string_equal(dst, "blat");
55 static void test_basenamecpy_good3(void **state)
59 assert_int_equal(basenamecpy("foo/bar", dst, sizeof(dst)), 3);
60 assert_string_equal(dst, "bar");
63 static void test_basenamecpy_good4(void **state)
67 assert_int_equal(basenamecpy("/xyzzy", dst, sizeof(dst)), 5);
68 assert_string_equal(dst, "xyzzy");
71 static void test_basenamecpy_good5(void **state)
75 assert_int_equal(basenamecpy("/foo/bar\n", dst, sizeof(dst)), 3);
76 assert_string_equal(dst, "bar");
79 /* multipath expects any trailing whitespace to be stripped off the basename,
80 * so that it will match pp->dev */
81 static void test_basenamecpy_good6(void **state)
85 assert_int_equal(basenamecpy("/xyzzy/plugh ", dst, sizeof(dst)), 5);
86 assert_string_equal(dst, "plugh");
89 static void test_basenamecpy_good7(void **state)
91 char src[] = "/foo/bar";
94 assert_int_equal(basenamecpy(src, dst, sizeof(dst)), 3);
96 strcpy(src, "badbadno");
97 assert_string_equal(dst, "bar");
100 /* buffer too small */
101 static void test_basenamecpy_bad0(void **state)
105 assert_int_equal(basenamecpy("baz", dst, sizeof(dst)), 0);
109 static void test_basenamecpy_bad1(void **state)
113 assert_int_equal(basenamecpy("foo/bar/", dst, sizeof(dst)), 0);
116 static void test_basenamecpy_bad2(void **state)
120 assert_int_equal(basenamecpy(NULL, dst, sizeof(dst)), 0);
123 static void test_basenamecpy_bad3(void **state)
127 assert_int_equal(basenamecpy("", dst, sizeof(dst)), 0);
130 static void test_basenamecpy_bad4(void **state)
134 assert_int_equal(basenamecpy("/", dst, sizeof(dst)), 0);
137 static void test_basenamecpy_bad5(void **state)
141 assert_int_equal(basenamecpy("baz/qux", NULL, sizeof(dst)), 0);
144 static void test_bitmask_1(void **state)
146 uint64_t arr[BITARR_SZ];
149 memset(arr, 0, sizeof(arr));
151 for (j = 0; j < BITARR_SZ; j++) {
152 for (i = 0; i < 64; i++) {
154 assert(!is_bit_set_in_array(b, arr));
155 set_bit_in_array(b, arr);
156 for (k = 0; k < BITARR_SZ; k++) {
157 printf("b = %d j = %d k = %d a = %"PRIx64"\n",
160 assert_int_equal(arr[j], 1ULL << i);
162 assert_int_equal(arr[k], 0ULL);
164 for (m = 0; m < 64; m++)
166 assert(is_bit_set_in_array(64 * j + m,
169 assert(!is_bit_set_in_array(64 * j + m,
171 clear_bit_in_array(b, arr);
172 assert(!is_bit_set_in_array(b, arr));
173 for (k = 0; k < BITARR_SZ; k++)
174 assert_int_equal(arr[k], 0ULL);
179 static void test_bitmask_2(void **state)
181 uint64_t arr[BITARR_SZ];
184 memset(arr, 0, sizeof(arr));
186 for (j = 0; j < BITARR_SZ; j++) {
187 for (i = 0; i < 64; i++) {
189 assert(!is_bit_set_in_array(b, arr));
190 set_bit_in_array(b, arr);
191 for (m = 0; m < 64; m++)
193 assert(is_bit_set_in_array(64 * j + m,
196 assert(!is_bit_set_in_array(64 * j + m,
198 assert(is_bit_set_in_array(b, arr));
199 for (k = 0; k < BITARR_SZ; k++) {
200 if (k < j || (k == j && i == 63))
201 assert_int_equal(arr[k], ~0ULL);
203 assert_int_equal(arr[k], 0ULL);
207 (1ULL << (i + 1)) - 1);
211 for (j = 0; j < BITARR_SZ; j++) {
212 for (i = 0; i < 64; i++) {
214 assert(is_bit_set_in_array(b, arr));
215 clear_bit_in_array(b, arr);
216 for (m = 0; m < 64; m++)
218 assert(!is_bit_set_in_array(64 * j + m,
221 assert(is_bit_set_in_array(64 * j + m,
223 assert(!is_bit_set_in_array(b, arr));
224 for (k = 0; k < BITARR_SZ; k++) {
225 if (k < j || (k == j && i == 63))
226 assert_int_equal(arr[k], 0ULL);
228 assert_int_equal(arr[k], ~0ULL);
232 ~((1ULL << (i + 1)) - 1));
238 int test_basenamecpy(void)
240 const struct CMUnitTest tests[] = {
241 cmocka_unit_test(test_basenamecpy_good0),
242 cmocka_unit_test(test_basenamecpy_good1),
243 cmocka_unit_test(test_basenamecpy_good2),
244 cmocka_unit_test(test_basenamecpy_good3),
245 cmocka_unit_test(test_basenamecpy_good4),
246 cmocka_unit_test(test_basenamecpy_good5),
247 cmocka_unit_test(test_basenamecpy_good6),
248 cmocka_unit_test(test_basenamecpy_good7),
249 cmocka_unit_test(test_basenamecpy_bad0),
250 cmocka_unit_test(test_basenamecpy_bad1),
251 cmocka_unit_test(test_basenamecpy_bad2),
252 cmocka_unit_test(test_basenamecpy_bad3),
253 cmocka_unit_test(test_basenamecpy_bad4),
254 cmocka_unit_test(test_basenamecpy_bad5),
255 cmocka_unit_test(test_bitmask_1),
256 cmocka_unit_test(test_bitmask_2),
258 return cmocka_run_group_tests(tests, NULL, NULL);
261 static const char src_str[] = "Hello";
263 /* strlcpy with length 0 */
264 static void test_strlcpy_0(void **state)
269 rc = strlcpy(tst, src_str, 0);
270 assert_int_equal(rc, strlen(src_str));
271 assert_string_equal(tst, "word");
274 /* strlcpy with length 1 */
275 static void test_strlcpy_1(void **state)
280 rc = strlcpy(tst, src_str, 1);
281 assert_int_equal(rc, strlen(src_str));
282 assert_int_equal(tst[0], '\0');
283 assert_string_equal(tst + 1, "ord");
286 /* strlcpy with length 2 */
287 static void test_strlcpy_2(void **state)
292 rc = strlcpy(tst, src_str, 2);
293 assert_int_equal(rc, strlen(src_str));
294 assert_int_equal(tst[0], src_str[0]);
295 assert_int_equal(tst[1], '\0');
296 assert_string_equal(tst + 2, "rd");
299 /* strlcpy with dst length < src length */
300 static void test_strlcpy_3(void **state)
305 rc = strlcpy(tst, src_str, sizeof(tst));
306 assert_int_equal(rc, strlen(src_str));
307 assert_int_equal(sizeof(tst) - 1, strlen(tst));
308 assert_true(strncmp(tst, src_str, sizeof(tst) - 1) == 0);
311 /* strlcpy with dst length > src length */
312 static void test_strlcpy_4(void **state)
314 static const char old[] = "0123456789";
319 rc = strlcpy(tst, src_str, sizeof(old));
320 assert_int_equal(rc, strlen(src_str));
321 assert_string_equal(src_str, tst);
322 assert_string_equal(tst + sizeof(src_str), old + sizeof(src_str));
326 /* strlcpy with dst length = src length, dst not terminated */
327 static void test_strlcpy_5(void **state)
331 const int sz = sizeof(src_str);
334 memset(tst, 'f', sizeof(src_str));
336 rc = strlcpy(tst, src_str, sz);
337 assert_int_equal(rc, strlen(src_str));
338 assert_string_equal(src_str, tst);
343 /* strlcpy with dst length > src length, dst not terminated */
344 static void test_strlcpy_6(void **state)
348 const int sz = sizeof(src_str);
350 tst = malloc(sz + 2);
351 memset(tst, 'f', sz + 2);
353 rc = strlcpy(tst, src_str, sz + 2);
354 assert_int_equal(rc, strlen(src_str));
355 assert_string_equal(src_str, tst);
356 assert_int_equal(tst[sz], 'f');
357 assert_int_equal(tst[sz + 1], 'f');
362 /* strlcpy with empty src */
363 static void test_strlcpy_7(void **state)
366 static const char empty[] = "";
369 rc = strlcpy(tst, empty, sizeof(tst));
370 assert_int_equal(rc, strlen(empty));
371 assert_string_equal(empty, tst);
372 assert_string_equal(tst + 1, "ord");
375 /* strlcpy with empty src, length 0 */
376 static void test_strlcpy_8(void **state)
379 static const char empty[] = "";
382 rc = strlcpy(tst, empty, 0);
383 assert_int_equal(rc, strlen(empty));
384 assert_string_equal("word", tst);
387 static int test_strlcpy(void)
389 const struct CMUnitTest tests[] = {
390 cmocka_unit_test(test_strlcpy_0),
391 cmocka_unit_test(test_strlcpy_1),
392 cmocka_unit_test(test_strlcpy_2),
393 cmocka_unit_test(test_strlcpy_3),
394 cmocka_unit_test(test_strlcpy_4),
395 cmocka_unit_test(test_strlcpy_5),
396 cmocka_unit_test(test_strlcpy_6),
397 cmocka_unit_test(test_strlcpy_7),
398 cmocka_unit_test(test_strlcpy_8),
401 return cmocka_run_group_tests(tests, NULL, NULL);
408 ret += test_basenamecpy();
409 ret += test_strlcpy();