xref: /f-stack/dpdk/app/test/test_string_fns.c (revision 4418919f)
1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
2*4418919fSjohnjiang  * Copyright(c) 2010-2014 Intel Corporation
3*4418919fSjohnjiang  */
4*4418919fSjohnjiang 
5*4418919fSjohnjiang #include <stdio.h>
6*4418919fSjohnjiang #include <stdarg.h>
7*4418919fSjohnjiang #include <stddef.h>
8*4418919fSjohnjiang #include <errno.h>
9*4418919fSjohnjiang #include <string.h>
10*4418919fSjohnjiang 
11*4418919fSjohnjiang #include <rte_string_fns.h>
12*4418919fSjohnjiang 
13*4418919fSjohnjiang #include "test.h"
14*4418919fSjohnjiang 
15*4418919fSjohnjiang #define LOG(...) do {\
16*4418919fSjohnjiang 	fprintf(stderr, "%s() ln %d: ", __func__, __LINE__); \
17*4418919fSjohnjiang 	fprintf(stderr, __VA_ARGS__); \
18*4418919fSjohnjiang } while(0)
19*4418919fSjohnjiang 
20*4418919fSjohnjiang #define DATA_BYTE 'a'
21*4418919fSjohnjiang 
22*4418919fSjohnjiang static int
test_rte_strsplit(void)23*4418919fSjohnjiang test_rte_strsplit(void)
24*4418919fSjohnjiang {
25*4418919fSjohnjiang 	int i;
26*4418919fSjohnjiang 	do {
27*4418919fSjohnjiang 		/* =======================================================
28*4418919fSjohnjiang 		 * split a mac address correct number of splits requested
29*4418919fSjohnjiang 		 * =======================================================*/
30*4418919fSjohnjiang 		char test_string[] = "54:65:76:87:98:90";
31*4418919fSjohnjiang 		char *splits[6];
32*4418919fSjohnjiang 
33*4418919fSjohnjiang 		LOG("Source string: '%s', to split on ':'\n", test_string);
34*4418919fSjohnjiang 		if (rte_strsplit(test_string, sizeof(test_string),
35*4418919fSjohnjiang 				splits, 6, ':') != 6) {
36*4418919fSjohnjiang 			LOG("Error splitting mac address\n");
37*4418919fSjohnjiang 			return -1;
38*4418919fSjohnjiang 		}
39*4418919fSjohnjiang 		for (i = 0; i < 6; i++)
40*4418919fSjohnjiang 			LOG("Token %d = %s\n", i + 1, splits[i]);
41*4418919fSjohnjiang 	} while (0);
42*4418919fSjohnjiang 
43*4418919fSjohnjiang 
44*4418919fSjohnjiang 	do {
45*4418919fSjohnjiang 		/* =======================================================
46*4418919fSjohnjiang 		 * split on spaces smaller number of splits requested
47*4418919fSjohnjiang 		 * =======================================================*/
48*4418919fSjohnjiang 		char test_string[] = "54 65 76 87 98 90";
49*4418919fSjohnjiang 		char *splits[6];
50*4418919fSjohnjiang 
51*4418919fSjohnjiang 		LOG("Source string: '%s', to split on ' '\n", test_string);
52*4418919fSjohnjiang 		if (rte_strsplit(test_string, sizeof(test_string),
53*4418919fSjohnjiang 				splits, 3, ' ') != 3) {
54*4418919fSjohnjiang 			LOG("Error splitting mac address for max 2 splits\n");
55*4418919fSjohnjiang 			return -1;
56*4418919fSjohnjiang 		}
57*4418919fSjohnjiang 		for (i = 0; i < 3; i++)
58*4418919fSjohnjiang 			LOG("Token %d = %s\n", i + 1, splits[i]);
59*4418919fSjohnjiang 	} while (0);
60*4418919fSjohnjiang 
61*4418919fSjohnjiang 	do {
62*4418919fSjohnjiang 		/* =======================================================
63*4418919fSjohnjiang 		 * split on commas - more splits than commas requested
64*4418919fSjohnjiang 		 * =======================================================*/
65*4418919fSjohnjiang 		char test_string[] = "a,b,c,d";
66*4418919fSjohnjiang 		char *splits[6];
67*4418919fSjohnjiang 
68*4418919fSjohnjiang 		LOG("Source string: '%s', to split on ','\n", test_string);
69*4418919fSjohnjiang 		if (rte_strsplit(test_string, sizeof(test_string),
70*4418919fSjohnjiang 				splits, 6, ',') != 4) {
71*4418919fSjohnjiang 			LOG("Error splitting %s on ','\n", test_string);
72*4418919fSjohnjiang 			return -1;
73*4418919fSjohnjiang 		}
74*4418919fSjohnjiang 		for (i = 0; i < 4; i++)
75*4418919fSjohnjiang 			LOG("Token %d = %s\n", i + 1, splits[i]);
76*4418919fSjohnjiang 	} while(0);
77*4418919fSjohnjiang 
78*4418919fSjohnjiang 	do {
79*4418919fSjohnjiang 		/* =======================================================
80*4418919fSjohnjiang 		 * Try splitting on non-existent character.
81*4418919fSjohnjiang 		 * =======================================================*/
82*4418919fSjohnjiang 		char test_string[] = "a,b,c,d";
83*4418919fSjohnjiang 		char *splits[6];
84*4418919fSjohnjiang 
85*4418919fSjohnjiang 		LOG("Source string: '%s', to split on ' '\n", test_string);
86*4418919fSjohnjiang 		if (rte_strsplit(test_string, sizeof(test_string),
87*4418919fSjohnjiang 				splits, 6, ' ') != 1) {
88*4418919fSjohnjiang 			LOG("Error splitting %s on ' '\n", test_string);
89*4418919fSjohnjiang 			return -1;
90*4418919fSjohnjiang 		}
91*4418919fSjohnjiang 		LOG("String not split\n");
92*4418919fSjohnjiang 	} while(0);
93*4418919fSjohnjiang 
94*4418919fSjohnjiang 	do {
95*4418919fSjohnjiang 		/* =======================================================
96*4418919fSjohnjiang 		 * Invalid / edge case parameter checks
97*4418919fSjohnjiang 		 * =======================================================*/
98*4418919fSjohnjiang 		char test_string[] = "a,b,c,d";
99*4418919fSjohnjiang 		char *splits[6];
100*4418919fSjohnjiang 
101*4418919fSjohnjiang 		if (rte_strsplit(NULL, 0, splits, 6, ',') >= 0
102*4418919fSjohnjiang 				|| errno != EINVAL){
103*4418919fSjohnjiang 			LOG("Error: rte_strsplit accepted NULL string parameter\n");
104*4418919fSjohnjiang 			return -1;
105*4418919fSjohnjiang 		}
106*4418919fSjohnjiang 
107*4418919fSjohnjiang 		if (rte_strsplit(test_string, sizeof(test_string), NULL, 0, ',') >= 0
108*4418919fSjohnjiang 				|| errno != EINVAL){
109*4418919fSjohnjiang 			LOG("Error: rte_strsplit accepted NULL array parameter\n");
110*4418919fSjohnjiang 			return -1;
111*4418919fSjohnjiang 		}
112*4418919fSjohnjiang 
113*4418919fSjohnjiang 		errno = 0;
114*4418919fSjohnjiang 		if (rte_strsplit(test_string, 0, splits, 6, ',') != 0 || errno != 0) {
115*4418919fSjohnjiang 			LOG("Error: rte_strsplit did not accept 0 length string\n");
116*4418919fSjohnjiang 			return -1;
117*4418919fSjohnjiang 		}
118*4418919fSjohnjiang 
119*4418919fSjohnjiang 		if (rte_strsplit(test_string, sizeof(test_string), splits, 0, ',') != 0
120*4418919fSjohnjiang 				|| errno != 0) {
121*4418919fSjohnjiang 			LOG("Error: rte_strsplit did not accept 0 length array\n");
122*4418919fSjohnjiang 			return -1;
123*4418919fSjohnjiang 		}
124*4418919fSjohnjiang 
125*4418919fSjohnjiang 		LOG("Parameter test cases passed\n");
126*4418919fSjohnjiang 	} while(0);
127*4418919fSjohnjiang 
128*4418919fSjohnjiang 	LOG("%s - PASSED\n", __func__);
129*4418919fSjohnjiang 	return 0;
130*4418919fSjohnjiang }
131*4418919fSjohnjiang 
132*4418919fSjohnjiang static int
test_rte_strlcat(void)133*4418919fSjohnjiang test_rte_strlcat(void)
134*4418919fSjohnjiang {
135*4418919fSjohnjiang 	/* only run actual unit tests if we have system-provided strlcat */
136*4418919fSjohnjiang #if defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD)
137*4418919fSjohnjiang #define BUF_LEN 32
138*4418919fSjohnjiang 	const char dst[BUF_LEN] = "Test string";
139*4418919fSjohnjiang 	const char src[] = " appended";
140*4418919fSjohnjiang 	char bsd_dst[BUF_LEN];
141*4418919fSjohnjiang 	char rte_dst[BUF_LEN];
142*4418919fSjohnjiang 	size_t i, bsd_ret, rte_ret;
143*4418919fSjohnjiang 
144*4418919fSjohnjiang 	LOG("dst = '%s', strlen(dst) = %zu\n", dst, strlen(dst));
145*4418919fSjohnjiang 	LOG("src = '%s', strlen(src) = %zu\n", src, strlen(src));
146*4418919fSjohnjiang 	LOG("---\n");
147*4418919fSjohnjiang 
148*4418919fSjohnjiang 	for (i = 0; i < BUF_LEN; i++) {
149*4418919fSjohnjiang 		/* initialize destination buffers */
150*4418919fSjohnjiang 		memcpy(bsd_dst, dst, BUF_LEN);
151*4418919fSjohnjiang 		memcpy(rte_dst, dst, BUF_LEN);
152*4418919fSjohnjiang 		/* compare implementations */
153*4418919fSjohnjiang 		bsd_ret = strlcat(bsd_dst, src, i);
154*4418919fSjohnjiang 		rte_ret = rte_strlcat(rte_dst, src, i);
155*4418919fSjohnjiang 		if (bsd_ret != rte_ret) {
156*4418919fSjohnjiang 			LOG("Incorrect retval for buf length = %zu\n", i);
157*4418919fSjohnjiang 			LOG("BSD: '%zu', rte: '%zu'\n", bsd_ret, rte_ret);
158*4418919fSjohnjiang 			return -1;
159*4418919fSjohnjiang 		}
160*4418919fSjohnjiang 		if (memcmp(bsd_dst, rte_dst, BUF_LEN) != 0) {
161*4418919fSjohnjiang 			LOG("Resulting buffers don't match\n");
162*4418919fSjohnjiang 			LOG("BSD: '%s', rte: '%s'\n", bsd_dst, rte_dst);
163*4418919fSjohnjiang 			return -1;
164*4418919fSjohnjiang 		}
165*4418919fSjohnjiang 		LOG("buffer size = %zu: dst = '%s', ret = %zu\n",
166*4418919fSjohnjiang 			i, rte_dst, rte_ret);
167*4418919fSjohnjiang 	}
168*4418919fSjohnjiang 	LOG("Checked %zu combinations\n", i);
169*4418919fSjohnjiang #undef BUF_LEN
170*4418919fSjohnjiang #endif /* defined(__BSD_VISIBLE) || defined(RTE_USE_LIBBSD) */
171*4418919fSjohnjiang 
172*4418919fSjohnjiang 	return 0;
173*4418919fSjohnjiang }
174*4418919fSjohnjiang 
175*4418919fSjohnjiang static int
test_string_fns(void)176*4418919fSjohnjiang test_string_fns(void)
177*4418919fSjohnjiang {
178*4418919fSjohnjiang 	if (test_rte_strsplit() < 0)
179*4418919fSjohnjiang 		return -1;
180*4418919fSjohnjiang 	if (test_rte_strlcat() < 0)
181*4418919fSjohnjiang 		return -1;
182*4418919fSjohnjiang 	return 0;
183*4418919fSjohnjiang }
184*4418919fSjohnjiang 
185*4418919fSjohnjiang REGISTER_TEST_COMMAND(string_autotest, test_string_fns);
186