xref: /dpdk/app/test/test_cmdline_portlist.c (revision 68a03efeed657e6e05f281479b33b51102797e15)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  */
4 
5 #include <stdio.h>
6 #include <string.h>
7 #include <inttypes.h>
8 
9 #include <rte_common.h>
10 
11 #include <cmdline_parse.h>
12 #include <cmdline_parse_portlist.h>
13 
14 #include "test_cmdline.h"
15 
16 struct portlist_str {
17 	const char * str;
18 	uint32_t portmap;
19 };
20 
21 /* valid strings */
22 const struct portlist_str portlist_valid_strs[] = {
23 		{"0", 0x1U },
24 		{"0-10", 0x7FFU},
25 		{"10-20", 0x1FFC00U},
26 		{"all", UINT32_MAX},
27 		{"0,1,2,3", 0xFU},
28 		{"0,1-5", 0x3FU},
29 		{"0,0,0", 0x1U},
30 		{"31,0-10,15", 0x800087FFU},
31 		{"0000", 0x1U},
32 		{"00,01,02,03", 0xFU},
33 		{"000,001,002,003", 0xFU},
34 };
35 
36 /* valid strings but with garbage at the end.
37  * these strings should still be valid because parser checks
38  * for end of token, which is either a space/tab, a newline/return,
39  * or a hash sign.
40  */
41 
42 const char * portlist_garbage_strs[] = {
43 		"0-31 garbage",
44 		"0-31#garbage",
45 		"0-31\0garbage",
46 		"0-31\ngarbage",
47 		"0-31\rgarbage",
48 		"0-31\tgarbage",
49 		"0,1,2,3-31 garbage",
50 		"0,1,2,3-31#garbage",
51 		"0,1,2,3-31\0garbage",
52 		"0,1,2,3-31\ngarbage",
53 		"0,1,2,3-31\rgarbage",
54 		"0,1,2,3-31\tgarbage",
55 		"all garbage",
56 		"all#garbage",
57 		"all\0garbage",
58 		"all\ngarbage",
59 		"all\rgarbage",
60 		"all\tgarbage",
61 };
62 
63 /* invalid strings */
64 const char * portlist_invalid_strs[] = {
65 		/* valid syntax, invalid chars */
66 		"A-B",
67 		"0-S",
68 		"1,2,3,4,Q",
69 		"A-4,3-15",
70 		"0-31invalid",
71 		/* valid chars, invalid syntax */
72 		"1, 2",
73 		"1- 4",
74 		",2",
75 		",2 ",
76 		"-1, 4",
77 		"5-1",
78 		"2-",
79 		/* misc */
80 		"-"
81 		"a",
82 		"A",
83 		",",
84 		"#",
85 		" ",
86 		"\0",
87 		"",
88 		/* too long */
89 		"0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,"
90 		"0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2",
91 };
92 
93 /* test invalid parameters */
94 int
95 test_parse_portlist_invalid_param(void)
96 {
97 	cmdline_portlist_t result;
98 	char buf[CMDLINE_TEST_BUFSIZE];
99 	int ret;
100 
101 	memset(&buf, 0, sizeof(buf));
102 	memset(&result, 0, sizeof(cmdline_portlist_t));
103 
104 	/* try all null */
105 	ret = cmdline_parse_portlist(NULL, NULL, NULL, 0);
106 	if (ret != -1) {
107 		printf("Error: parser accepted null parameters!\n");
108 		return -1;
109 	}
110 
111 	/* try null buf */
112 	ret = cmdline_parse_portlist(NULL, NULL, (void*)&result,
113 		sizeof(result));
114 	if (ret != -1) {
115 		printf("Error: parser accepted null string!\n");
116 		return -1;
117 	}
118 
119 	/* try null result */
120 	ret = cmdline_parse_portlist(NULL, portlist_valid_strs[0].str, NULL, 0);
121 	if (ret == -1) {
122 		printf("Error: parser rejected null result!\n");
123 		return -1;
124 	}
125 
126 	/* token is not used in ether_parse anyway so there's no point in
127 	 * testing it */
128 
129 	/* test help function */
130 
131 	/* coverage! */
132 	ret = cmdline_get_help_portlist(NULL, buf, sizeof(buf));
133 	if (ret < 0) {
134 		printf("Error: help function failed with valid parameters!\n");
135 		return -1;
136 	}
137 
138 	return 0;
139 }
140 
141 /* test valid parameters but invalid data */
142 int
143 test_parse_portlist_invalid_data(void)
144 {
145 	int ret = 0;
146 	unsigned i;
147 	cmdline_portlist_t result;
148 
149 	/* test invalid strings */
150 	for (i = 0; i < RTE_DIM(portlist_invalid_strs); i++) {
151 
152 		memset(&result, 0, sizeof(cmdline_portlist_t));
153 
154 		ret = cmdline_parse_portlist(NULL, portlist_invalid_strs[i],
155 			(void*)&result, sizeof(result));
156 		if (ret != -1) {
157 			printf("Error: parsing %s succeeded!\n",
158 					portlist_invalid_strs[i]);
159 			return -1;
160 		}
161 	}
162 
163 	return 0;
164 }
165 
166 /* test valid parameters and data */
167 int
168 test_parse_portlist_valid(void)
169 {
170 	int ret = 0;
171 	unsigned i;
172 	cmdline_portlist_t result;
173 
174 	/* test full strings */
175 	for (i = 0; i < RTE_DIM(portlist_valid_strs); i++) {
176 
177 		memset(&result, 0, sizeof(cmdline_portlist_t));
178 
179 		ret = cmdline_parse_portlist(NULL, portlist_valid_strs[i].str,
180 			(void*)&result, sizeof(result));
181 		if (ret < 0) {
182 			printf("Error: parsing %s failed!\n",
183 					portlist_valid_strs[i].str);
184 			return -1;
185 		}
186 		if (result.map != portlist_valid_strs[i].portmap) {
187 			printf("Error: parsing %s failed: map mismatch!\n",
188 					portlist_valid_strs[i].str);
189 			return -1;
190 		}
191 	}
192 
193 	/* test garbage strings */
194 	for (i = 0; i < RTE_DIM(portlist_garbage_strs); i++) {
195 
196 		memset(&result, 0, sizeof(cmdline_portlist_t));
197 
198 		ret = cmdline_parse_portlist(NULL, portlist_garbage_strs[i],
199 			(void*)&result, sizeof(result));
200 		if (ret < 0) {
201 			printf("Error: parsing %s failed!\n",
202 					portlist_garbage_strs[i]);
203 			return -1;
204 		}
205 		if (result.map != UINT32_MAX) {
206 			printf("Error: parsing %s failed: map mismatch!\n",
207 					portlist_garbage_strs[i]);
208 			return -1;
209 		}
210 	}
211 
212 	return 0;
213 }
214