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