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