xref: /dpdk/app/test/test_cmdline_lib.c (revision 64e14b8b072ae694ef35a3392639223ecf862820)
1a9de470cSBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
2a9de470cSBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
3a9de470cSBruce Richardson  */
4a9de470cSBruce Richardson 
5a9de470cSBruce Richardson #include <string.h>
6a9de470cSBruce Richardson #include <stdio.h>
7a9de470cSBruce Richardson #include <stdint.h>
8a9de470cSBruce Richardson #include <stdarg.h>
9a9de470cSBruce Richardson #include <stdlib.h>
10a9de470cSBruce Richardson #include <errno.h>
11a9de470cSBruce Richardson #include <ctype.h>
12a9de470cSBruce Richardson #include <sys/queue.h>
13a9de470cSBruce Richardson 
14f2fc83b4SThomas Monjalon #include <rte_common.h>
15f2fc83b4SThomas Monjalon 
16a9de470cSBruce Richardson #include <cmdline_vt100.h>
17a9de470cSBruce Richardson #include <cmdline_rdline.h>
18a9de470cSBruce Richardson #include <cmdline_parse.h>
19a9de470cSBruce Richardson #include <cmdline_socket.h>
20a9de470cSBruce Richardson #include <cmdline.h>
21a9de470cSBruce Richardson 
22a9de470cSBruce Richardson #include "test_cmdline.h"
23a9de470cSBruce Richardson 
24*987d40a0SJie Zhou #ifndef RTE_EXEC_ENV_WINDOWS
25*987d40a0SJie Zhou #define NULL_INPUT "/dev/null"
26*987d40a0SJie Zhou #else
27*987d40a0SJie Zhou #define NULL_INPUT "NUL"
28*987d40a0SJie Zhou #endif
29*987d40a0SJie Zhou 
30a9de470cSBruce Richardson /****************************************************************/
31a9de470cSBruce Richardson /* static functions required for some tests */
32a9de470cSBruce Richardson static void
valid_buffer(__rte_unused struct rdline * rdl,__rte_unused const char * buf,__rte_unused unsigned int size)33f2fc83b4SThomas Monjalon valid_buffer(__rte_unused struct rdline *rdl,
34f2fc83b4SThomas Monjalon 			__rte_unused const char *buf,
35f2fc83b4SThomas Monjalon 			__rte_unused unsigned int size)
36a9de470cSBruce Richardson {
37a9de470cSBruce Richardson }
38a9de470cSBruce Richardson 
39a9de470cSBruce Richardson static int
complete_buffer(__rte_unused struct rdline * rdl,__rte_unused const char * buf,__rte_unused char * dstbuf,__rte_unused unsigned int dstsize,__rte_unused int * state)40f2fc83b4SThomas Monjalon complete_buffer(__rte_unused struct rdline *rdl,
41f2fc83b4SThomas Monjalon 			__rte_unused const char *buf,
42f2fc83b4SThomas Monjalon 			__rte_unused char *dstbuf,
43f2fc83b4SThomas Monjalon 			__rte_unused unsigned int dstsize,
44f2fc83b4SThomas Monjalon 			__rte_unused int *state)
45a9de470cSBruce Richardson {
46a9de470cSBruce Richardson 	return 0;
47a9de470cSBruce Richardson }
48a9de470cSBruce Richardson 
49a9de470cSBruce Richardson /****************************************************************/
50a9de470cSBruce Richardson 
51a9de470cSBruce Richardson static int
test_cmdline_parse_fns(void)52a9de470cSBruce Richardson test_cmdline_parse_fns(void)
53a9de470cSBruce Richardson {
5451fcb6a1SDmitry Kozlyuk 	struct cmdline *cl;
5551fcb6a1SDmitry Kozlyuk 	cmdline_parse_ctx_t ctx;
56a9de470cSBruce Richardson 	int i = 0;
57a9de470cSBruce Richardson 	char dst[CMDLINE_TEST_BUFSIZE];
58a9de470cSBruce Richardson 
5951fcb6a1SDmitry Kozlyuk 	cl = cmdline_new(&ctx, "prompt", -1, -1);
6051fcb6a1SDmitry Kozlyuk 	if (cl == NULL) {
6151fcb6a1SDmitry Kozlyuk 		printf("Error: cannot create cmdline to test parse fns!\n");
6251fcb6a1SDmitry Kozlyuk 		return -1;
6351fcb6a1SDmitry Kozlyuk 	}
6451fcb6a1SDmitry Kozlyuk 
65a9de470cSBruce Richardson 	if (cmdline_parse(NULL, "buffer") >= 0)
66a9de470cSBruce Richardson 		goto error;
6751fcb6a1SDmitry Kozlyuk 	if (cmdline_parse(cl, NULL) >= 0)
68a9de470cSBruce Richardson 		goto error;
69a9de470cSBruce Richardson 
70a9de470cSBruce Richardson 	if (cmdline_complete(NULL, "buffer", &i, dst, sizeof(dst)) >= 0)
71a9de470cSBruce Richardson 		goto error;
7251fcb6a1SDmitry Kozlyuk 	if (cmdline_complete(cl, NULL, &i, dst, sizeof(dst)) >= 0)
73a9de470cSBruce Richardson 		goto error;
7451fcb6a1SDmitry Kozlyuk 	if (cmdline_complete(cl, "buffer", NULL, dst, sizeof(dst)) >= 0)
75a9de470cSBruce Richardson 		goto error;
7651fcb6a1SDmitry Kozlyuk 	if (cmdline_complete(cl, "buffer", &i, NULL, sizeof(dst)) >= 0)
77a9de470cSBruce Richardson 		goto error;
78a9de470cSBruce Richardson 
79ca7204b9SOwen Hilyard 	cmdline_free(cl);
80a9de470cSBruce Richardson 	return 0;
81a9de470cSBruce Richardson 
82a9de470cSBruce Richardson error:
83a9de470cSBruce Richardson 	printf("Error: function accepted null parameter!\n");
84ca7204b9SOwen Hilyard 	cmdline_free(cl);
85a9de470cSBruce Richardson 	return -1;
86a9de470cSBruce Richardson }
87a9de470cSBruce Richardson 
88a9de470cSBruce Richardson static int
test_cmdline_rdline_fns(void)89a9de470cSBruce Richardson test_cmdline_rdline_fns(void)
90a9de470cSBruce Richardson {
91f8f8dc28SDmitry Kozlyuk 	struct rdline *rdl;
92a9de470cSBruce Richardson 	rdline_write_char_t *wc = &cmdline_write_char;
93a9de470cSBruce Richardson 	rdline_validate_t *v = &valid_buffer;
94a9de470cSBruce Richardson 	rdline_complete_t *c = &complete_buffer;
95a9de470cSBruce Richardson 
96f8f8dc28SDmitry Kozlyuk 	rdl = rdline_new(NULL, v, c, NULL);
97f8f8dc28SDmitry Kozlyuk 	if (rdl != NULL)
98a9de470cSBruce Richardson 		goto error;
99f8f8dc28SDmitry Kozlyuk 	rdl = rdline_new(wc, NULL, c, NULL);
100f8f8dc28SDmitry Kozlyuk 	if (rdl != NULL)
101a9de470cSBruce Richardson 		goto error;
102f8f8dc28SDmitry Kozlyuk 	rdl = rdline_new(wc, v, NULL, NULL);
103f8f8dc28SDmitry Kozlyuk 	if (rdl != NULL)
104a9de470cSBruce Richardson 		goto error;
105a9de470cSBruce Richardson 	if (rdline_char_in(NULL, 0) >= 0)
106a9de470cSBruce Richardson 		goto error;
107a9de470cSBruce Richardson 	if (rdline_get_buffer(NULL) != NULL)
108a9de470cSBruce Richardson 		goto error;
109a9de470cSBruce Richardson 	if (rdline_add_history(NULL, "history") >= 0)
110a9de470cSBruce Richardson 		goto error;
111f8f8dc28SDmitry Kozlyuk 	if (rdline_add_history(rdl, NULL) >= 0)
112a9de470cSBruce Richardson 		goto error;
113a9de470cSBruce Richardson 	if (rdline_get_history_item(NULL, 0) != NULL)
114a9de470cSBruce Richardson 		goto error;
115a9de470cSBruce Richardson 
116a9de470cSBruce Richardson 	/* void functions */
117f8f8dc28SDmitry Kozlyuk 	rdline_get_history_buffer_size(NULL);
118f8f8dc28SDmitry Kozlyuk 	rdline_get_opaque(NULL);
119a9de470cSBruce Richardson 	rdline_newline(NULL, "prompt");
120f8f8dc28SDmitry Kozlyuk 	rdline_newline(rdl, NULL);
121a9de470cSBruce Richardson 	rdline_stop(NULL);
122a9de470cSBruce Richardson 	rdline_quit(NULL);
123a9de470cSBruce Richardson 	rdline_restart(NULL);
124a9de470cSBruce Richardson 	rdline_redisplay(NULL);
125a9de470cSBruce Richardson 	rdline_reset(NULL);
126a9de470cSBruce Richardson 	rdline_clear_history(NULL);
127f8f8dc28SDmitry Kozlyuk 	rdline_free(NULL);
128a9de470cSBruce Richardson 
129f8f8dc28SDmitry Kozlyuk 	rdline_free(rdl);
130a9de470cSBruce Richardson 	return 0;
131a9de470cSBruce Richardson 
132a9de470cSBruce Richardson error:
133a9de470cSBruce Richardson 	printf("Error: function accepted null parameter!\n");
134f8f8dc28SDmitry Kozlyuk 	rdline_free(rdl);
135a9de470cSBruce Richardson 	return -1;
136a9de470cSBruce Richardson }
137a9de470cSBruce Richardson 
138a9de470cSBruce Richardson static int
test_cmdline_vt100_fns(void)139a9de470cSBruce Richardson test_cmdline_vt100_fns(void)
140a9de470cSBruce Richardson {
141a9de470cSBruce Richardson 	if (vt100_parser(NULL, 0) >= 0) {
142a9de470cSBruce Richardson 		printf("Error: function accepted null parameter!\n");
143a9de470cSBruce Richardson 		return -1;
144a9de470cSBruce Richardson 	}
145a9de470cSBruce Richardson 
146a9de470cSBruce Richardson 	/* void functions */
147a9de470cSBruce Richardson 	vt100_init(NULL);
148a9de470cSBruce Richardson 
149a9de470cSBruce Richardson 	return 0;
150a9de470cSBruce Richardson }
151a9de470cSBruce Richardson 
152a9de470cSBruce Richardson static int
test_cmdline_socket_fns(void)153a9de470cSBruce Richardson test_cmdline_socket_fns(void)
154a9de470cSBruce Richardson {
155a9de470cSBruce Richardson 	cmdline_parse_ctx_t ctx;
156ca7204b9SOwen Hilyard 	struct cmdline *cl;
157a9de470cSBruce Richardson 
158ca7204b9SOwen Hilyard 	cl = cmdline_stdin_new(NULL, "prompt");
159ca7204b9SOwen Hilyard 	if (cl != NULL)
160a9de470cSBruce Richardson 		goto error;
161ca7204b9SOwen Hilyard 	cl = cmdline_stdin_new(&ctx, NULL);
162ca7204b9SOwen Hilyard 	if (cl != NULL)
163a9de470cSBruce Richardson 		goto error;
164*987d40a0SJie Zhou 	cl = cmdline_file_new(NULL, "prompt", NULL_INPUT);
165ca7204b9SOwen Hilyard 	if (cl != NULL)
166a9de470cSBruce Richardson 		goto error;
167*987d40a0SJie Zhou 	cl = cmdline_file_new(&ctx, NULL, NULL_INPUT);
168ca7204b9SOwen Hilyard 	if (cl != NULL)
169a9de470cSBruce Richardson 		goto error;
170ca7204b9SOwen Hilyard 	cl = cmdline_file_new(&ctx, "prompt", NULL);
171ca7204b9SOwen Hilyard 	if (cl != NULL)
172a9de470cSBruce Richardson 		goto error;
173ca7204b9SOwen Hilyard 	cl = cmdline_file_new(&ctx, "prompt", "-/invalid/~/path");
174ca7204b9SOwen Hilyard 	if (cl != NULL) {
175a9de470cSBruce Richardson 		printf("Error: succeeded in opening invalid file for reading!");
176ca7204b9SOwen Hilyard 		cmdline_free(cl);
177a9de470cSBruce Richardson 		return -1;
178a9de470cSBruce Richardson 	}
179*987d40a0SJie Zhou 	cl = cmdline_file_new(&ctx, "prompt", NULL_INPUT);
180ca7204b9SOwen Hilyard 	if (cl == NULL) {
181a9de470cSBruce Richardson 		printf("Error: failed to open /dev/null for reading!");
182a9de470cSBruce Richardson 		return -1;
183a9de470cSBruce Richardson 	}
18486e361cdSDavid Marchand 	cmdline_free(cl);
18586e361cdSDavid Marchand 	cl = NULL;
186a9de470cSBruce Richardson 
187a9de470cSBruce Richardson 	/* void functions */
188a9de470cSBruce Richardson 	cmdline_stdin_exit(NULL);
189a9de470cSBruce Richardson 
190a9de470cSBruce Richardson 	return 0;
191a9de470cSBruce Richardson error:
192a9de470cSBruce Richardson 	printf("Error: function accepted null parameter!\n");
193ca7204b9SOwen Hilyard 	cmdline_free(cl);
194a9de470cSBruce Richardson 	return -1;
195a9de470cSBruce Richardson }
196a9de470cSBruce Richardson 
197a9de470cSBruce Richardson static int
test_cmdline_fns(void)198a9de470cSBruce Richardson test_cmdline_fns(void)
199a9de470cSBruce Richardson {
200a9de470cSBruce Richardson 	cmdline_parse_ctx_t ctx;
20151fcb6a1SDmitry Kozlyuk 	struct cmdline *cl;
202a9de470cSBruce Richardson 
203a9de470cSBruce Richardson 	memset(&ctx, 0, sizeof(ctx));
204ca7204b9SOwen Hilyard 	cl = cmdline_new(NULL, "prompt", 0, 0);
205ca7204b9SOwen Hilyard 	if (cl != NULL)
206ca7204b9SOwen Hilyard 		goto error;
207ca7204b9SOwen Hilyard 	cl = cmdline_new(&ctx, NULL, 0, 0);
208ca7204b9SOwen Hilyard 	if (cl != NULL)
209ca7204b9SOwen Hilyard 		goto error;
21051fcb6a1SDmitry Kozlyuk 	cl = cmdline_new(&ctx, "test", -1, -1);
21151fcb6a1SDmitry Kozlyuk 	if (cl == NULL)
212a9de470cSBruce Richardson 		goto error;
213a9de470cSBruce Richardson 	if (cmdline_in(NULL, "buffer", CMDLINE_TEST_BUFSIZE) >= 0)
214a9de470cSBruce Richardson 		goto error;
21551fcb6a1SDmitry Kozlyuk 	if (cmdline_in(cl, NULL, CMDLINE_TEST_BUFSIZE) >= 0)
216a9de470cSBruce Richardson 		goto error;
217a9de470cSBruce Richardson 	if (cmdline_write_char(NULL, 0) >= 0)
218a9de470cSBruce Richardson 		goto error;
219a9de470cSBruce Richardson 
220a9de470cSBruce Richardson 	/* void functions */
221a9de470cSBruce Richardson 	cmdline_set_prompt(NULL, "prompt");
222a9de470cSBruce Richardson 	cmdline_free(NULL);
223a9de470cSBruce Richardson 	cmdline_printf(NULL, "format");
224a9de470cSBruce Richardson 	cmdline_interact(NULL);
225a9de470cSBruce Richardson 	cmdline_quit(NULL);
226a9de470cSBruce Richardson 
227ca7204b9SOwen Hilyard 	cmdline_free(cl);
228a9de470cSBruce Richardson 	return 0;
229a9de470cSBruce Richardson 
230a9de470cSBruce Richardson error:
231a9de470cSBruce Richardson 	printf("Error: function accepted null parameter!\n");
23251fcb6a1SDmitry Kozlyuk 	cmdline_free(cl);
233a9de470cSBruce Richardson 	return -1;
234a9de470cSBruce Richardson }
235a9de470cSBruce Richardson 
236a9de470cSBruce Richardson /* test library functions. the point of these tests is not so much to test
237a9de470cSBruce Richardson  * functions' behaviour as it is to make sure there are no segfaults if
238a9de470cSBruce Richardson  * they are called with invalid parameters.
239a9de470cSBruce Richardson  */
240a9de470cSBruce Richardson int
test_cmdline_lib(void)241a9de470cSBruce Richardson test_cmdline_lib(void)
242a9de470cSBruce Richardson {
243a9de470cSBruce Richardson 	if (test_cmdline_parse_fns() < 0)
244a9de470cSBruce Richardson 		return -1;
245a9de470cSBruce Richardson 	if (test_cmdline_rdline_fns() < 0)
246a9de470cSBruce Richardson 		return -1;
247a9de470cSBruce Richardson 	if (test_cmdline_vt100_fns() < 0)
248a9de470cSBruce Richardson 		return -1;
249a9de470cSBruce Richardson 	if (test_cmdline_socket_fns() < 0)
250a9de470cSBruce Richardson 		return -1;
251a9de470cSBruce Richardson 	if (test_cmdline_fns() < 0)
252a9de470cSBruce Richardson 		return -1;
253a9de470cSBruce Richardson 	return 0;
254a9de470cSBruce Richardson }
255