14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang * Copyright(c) 2010-2014 Intel Corporation
34418919fSjohnjiang */
44418919fSjohnjiang
54418919fSjohnjiang #include <string.h>
64418919fSjohnjiang #include <stdio.h>
74418919fSjohnjiang #include <stdint.h>
84418919fSjohnjiang #include <stdarg.h>
94418919fSjohnjiang #include <stdlib.h>
104418919fSjohnjiang #include <errno.h>
114418919fSjohnjiang #include <termios.h>
124418919fSjohnjiang #include <ctype.h>
134418919fSjohnjiang #include <sys/queue.h>
144418919fSjohnjiang
15*2d9fd380Sjfb8856606 #include <rte_common.h>
16*2d9fd380Sjfb8856606
174418919fSjohnjiang #include <cmdline_vt100.h>
184418919fSjohnjiang #include <cmdline_rdline.h>
194418919fSjohnjiang #include <cmdline_parse.h>
204418919fSjohnjiang #include <cmdline_socket.h>
214418919fSjohnjiang #include <cmdline.h>
224418919fSjohnjiang
234418919fSjohnjiang #include "test_cmdline.h"
244418919fSjohnjiang
254418919fSjohnjiang /****************************************************************/
264418919fSjohnjiang /* static functions required for some tests */
274418919fSjohnjiang static void
valid_buffer(__rte_unused struct rdline * rdl,__rte_unused const char * buf,__rte_unused unsigned int size)28*2d9fd380Sjfb8856606 valid_buffer(__rte_unused struct rdline *rdl,
29*2d9fd380Sjfb8856606 __rte_unused const char *buf,
30*2d9fd380Sjfb8856606 __rte_unused unsigned int size)
314418919fSjohnjiang {
324418919fSjohnjiang }
334418919fSjohnjiang
344418919fSjohnjiang 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)35*2d9fd380Sjfb8856606 complete_buffer(__rte_unused struct rdline *rdl,
36*2d9fd380Sjfb8856606 __rte_unused const char *buf,
37*2d9fd380Sjfb8856606 __rte_unused char *dstbuf,
38*2d9fd380Sjfb8856606 __rte_unused unsigned int dstsize,
39*2d9fd380Sjfb8856606 __rte_unused int *state)
404418919fSjohnjiang {
414418919fSjohnjiang return 0;
424418919fSjohnjiang }
434418919fSjohnjiang
444418919fSjohnjiang /****************************************************************/
454418919fSjohnjiang
464418919fSjohnjiang static int
test_cmdline_parse_fns(void)474418919fSjohnjiang test_cmdline_parse_fns(void)
484418919fSjohnjiang {
49*2d9fd380Sjfb8856606 struct cmdline *cl;
50*2d9fd380Sjfb8856606 cmdline_parse_ctx_t ctx;
514418919fSjohnjiang int i = 0;
524418919fSjohnjiang char dst[CMDLINE_TEST_BUFSIZE];
534418919fSjohnjiang
54*2d9fd380Sjfb8856606 cl = cmdline_new(&ctx, "prompt", -1, -1);
55*2d9fd380Sjfb8856606 if (cl == NULL) {
56*2d9fd380Sjfb8856606 printf("Error: cannot create cmdline to test parse fns!\n");
57*2d9fd380Sjfb8856606 return -1;
58*2d9fd380Sjfb8856606 }
59*2d9fd380Sjfb8856606
604418919fSjohnjiang if (cmdline_parse(NULL, "buffer") >= 0)
614418919fSjohnjiang goto error;
62*2d9fd380Sjfb8856606 if (cmdline_parse(cl, NULL) >= 0)
634418919fSjohnjiang goto error;
644418919fSjohnjiang
654418919fSjohnjiang if (cmdline_complete(NULL, "buffer", &i, dst, sizeof(dst)) >= 0)
664418919fSjohnjiang goto error;
67*2d9fd380Sjfb8856606 if (cmdline_complete(cl, NULL, &i, dst, sizeof(dst)) >= 0)
684418919fSjohnjiang goto error;
69*2d9fd380Sjfb8856606 if (cmdline_complete(cl, "buffer", NULL, dst, sizeof(dst)) >= 0)
704418919fSjohnjiang goto error;
71*2d9fd380Sjfb8856606 if (cmdline_complete(cl, "buffer", &i, NULL, sizeof(dst)) >= 0)
724418919fSjohnjiang goto error;
734418919fSjohnjiang
744418919fSjohnjiang return 0;
754418919fSjohnjiang
764418919fSjohnjiang error:
774418919fSjohnjiang printf("Error: function accepted null parameter!\n");
784418919fSjohnjiang return -1;
794418919fSjohnjiang }
804418919fSjohnjiang
814418919fSjohnjiang static int
test_cmdline_rdline_fns(void)824418919fSjohnjiang test_cmdline_rdline_fns(void)
834418919fSjohnjiang {
844418919fSjohnjiang struct rdline rdl;
854418919fSjohnjiang rdline_write_char_t *wc = &cmdline_write_char;
864418919fSjohnjiang rdline_validate_t *v = &valid_buffer;
874418919fSjohnjiang rdline_complete_t *c = &complete_buffer;
884418919fSjohnjiang
894418919fSjohnjiang if (rdline_init(NULL, wc, v, c) >= 0)
904418919fSjohnjiang goto error;
914418919fSjohnjiang if (rdline_init(&rdl, NULL, v, c) >= 0)
924418919fSjohnjiang goto error;
934418919fSjohnjiang if (rdline_init(&rdl, wc, NULL, c) >= 0)
944418919fSjohnjiang goto error;
954418919fSjohnjiang if (rdline_init(&rdl, wc, v, NULL) >= 0)
964418919fSjohnjiang goto error;
974418919fSjohnjiang if (rdline_char_in(NULL, 0) >= 0)
984418919fSjohnjiang goto error;
994418919fSjohnjiang if (rdline_get_buffer(NULL) != NULL)
1004418919fSjohnjiang goto error;
1014418919fSjohnjiang if (rdline_add_history(NULL, "history") >= 0)
1024418919fSjohnjiang goto error;
1034418919fSjohnjiang if (rdline_add_history(&rdl, NULL) >= 0)
1044418919fSjohnjiang goto error;
1054418919fSjohnjiang if (rdline_get_history_item(NULL, 0) != NULL)
1064418919fSjohnjiang goto error;
1074418919fSjohnjiang
1084418919fSjohnjiang /* void functions */
1094418919fSjohnjiang rdline_newline(NULL, "prompt");
1104418919fSjohnjiang rdline_newline(&rdl, NULL);
1114418919fSjohnjiang rdline_stop(NULL);
1124418919fSjohnjiang rdline_quit(NULL);
1134418919fSjohnjiang rdline_restart(NULL);
1144418919fSjohnjiang rdline_redisplay(NULL);
1154418919fSjohnjiang rdline_reset(NULL);
1164418919fSjohnjiang rdline_clear_history(NULL);
1174418919fSjohnjiang
1184418919fSjohnjiang return 0;
1194418919fSjohnjiang
1204418919fSjohnjiang error:
1214418919fSjohnjiang printf("Error: function accepted null parameter!\n");
1224418919fSjohnjiang return -1;
1234418919fSjohnjiang }
1244418919fSjohnjiang
1254418919fSjohnjiang static int
test_cmdline_vt100_fns(void)1264418919fSjohnjiang test_cmdline_vt100_fns(void)
1274418919fSjohnjiang {
1284418919fSjohnjiang if (vt100_parser(NULL, 0) >= 0) {
1294418919fSjohnjiang printf("Error: function accepted null parameter!\n");
1304418919fSjohnjiang return -1;
1314418919fSjohnjiang }
1324418919fSjohnjiang
1334418919fSjohnjiang /* void functions */
1344418919fSjohnjiang vt100_init(NULL);
1354418919fSjohnjiang
1364418919fSjohnjiang return 0;
1374418919fSjohnjiang }
1384418919fSjohnjiang
1394418919fSjohnjiang static int
test_cmdline_socket_fns(void)1404418919fSjohnjiang test_cmdline_socket_fns(void)
1414418919fSjohnjiang {
1424418919fSjohnjiang cmdline_parse_ctx_t ctx;
1434418919fSjohnjiang
1444418919fSjohnjiang if (cmdline_stdin_new(NULL, "prompt") != NULL)
1454418919fSjohnjiang goto error;
1464418919fSjohnjiang if (cmdline_stdin_new(&ctx, NULL) != NULL)
1474418919fSjohnjiang goto error;
1484418919fSjohnjiang if (cmdline_file_new(NULL, "prompt", "/dev/null") != NULL)
1494418919fSjohnjiang goto error;
1504418919fSjohnjiang if (cmdline_file_new(&ctx, NULL, "/dev/null") != NULL)
1514418919fSjohnjiang goto error;
1524418919fSjohnjiang if (cmdline_file_new(&ctx, "prompt", NULL) != NULL)
1534418919fSjohnjiang goto error;
1544418919fSjohnjiang if (cmdline_file_new(&ctx, "prompt", "-/invalid/~/path") != NULL) {
1554418919fSjohnjiang printf("Error: succeeded in opening invalid file for reading!");
1564418919fSjohnjiang return -1;
1574418919fSjohnjiang }
1584418919fSjohnjiang if (cmdline_file_new(&ctx, "prompt", "/dev/null") == NULL) {
1594418919fSjohnjiang printf("Error: failed to open /dev/null for reading!");
1604418919fSjohnjiang return -1;
1614418919fSjohnjiang }
1624418919fSjohnjiang
1634418919fSjohnjiang /* void functions */
1644418919fSjohnjiang cmdline_stdin_exit(NULL);
1654418919fSjohnjiang
1664418919fSjohnjiang return 0;
1674418919fSjohnjiang error:
1684418919fSjohnjiang printf("Error: function accepted null parameter!\n");
1694418919fSjohnjiang return -1;
1704418919fSjohnjiang }
1714418919fSjohnjiang
1724418919fSjohnjiang static int
test_cmdline_fns(void)1734418919fSjohnjiang test_cmdline_fns(void)
1744418919fSjohnjiang {
1754418919fSjohnjiang cmdline_parse_ctx_t ctx;
176*2d9fd380Sjfb8856606 struct cmdline *cl;
1774418919fSjohnjiang
1784418919fSjohnjiang memset(&ctx, 0, sizeof(ctx));
179*2d9fd380Sjfb8856606 cl = cmdline_new(&ctx, "test", -1, -1);
180*2d9fd380Sjfb8856606 if (cl == NULL)
1814418919fSjohnjiang goto error;
1824418919fSjohnjiang
1834418919fSjohnjiang if (cmdline_new(NULL, "prompt", 0, 0) != NULL)
1844418919fSjohnjiang goto error;
1854418919fSjohnjiang if (cmdline_new(&ctx, NULL, 0, 0) != NULL)
1864418919fSjohnjiang goto error;
1874418919fSjohnjiang if (cmdline_in(NULL, "buffer", CMDLINE_TEST_BUFSIZE) >= 0)
1884418919fSjohnjiang goto error;
189*2d9fd380Sjfb8856606 if (cmdline_in(cl, NULL, CMDLINE_TEST_BUFSIZE) >= 0)
1904418919fSjohnjiang goto error;
1914418919fSjohnjiang if (cmdline_write_char(NULL, 0) >= 0)
1924418919fSjohnjiang goto error;
1934418919fSjohnjiang
1944418919fSjohnjiang /* void functions */
1954418919fSjohnjiang cmdline_set_prompt(NULL, "prompt");
1964418919fSjohnjiang cmdline_free(NULL);
1974418919fSjohnjiang cmdline_printf(NULL, "format");
1984418919fSjohnjiang cmdline_interact(NULL);
1994418919fSjohnjiang cmdline_quit(NULL);
2004418919fSjohnjiang
2014418919fSjohnjiang return 0;
2024418919fSjohnjiang
2034418919fSjohnjiang error:
2044418919fSjohnjiang printf("Error: function accepted null parameter!\n");
205*2d9fd380Sjfb8856606 if (cl != NULL)
206*2d9fd380Sjfb8856606 cmdline_free(cl);
2074418919fSjohnjiang return -1;
2084418919fSjohnjiang }
2094418919fSjohnjiang
2104418919fSjohnjiang /* test library functions. the point of these tests is not so much to test
2114418919fSjohnjiang * functions' behaviour as it is to make sure there are no segfaults if
2124418919fSjohnjiang * they are called with invalid parameters.
2134418919fSjohnjiang */
2144418919fSjohnjiang int
test_cmdline_lib(void)2154418919fSjohnjiang test_cmdline_lib(void)
2164418919fSjohnjiang {
2174418919fSjohnjiang if (test_cmdline_parse_fns() < 0)
2184418919fSjohnjiang return -1;
2194418919fSjohnjiang if (test_cmdline_rdline_fns() < 0)
2204418919fSjohnjiang return -1;
2214418919fSjohnjiang if (test_cmdline_vt100_fns() < 0)
2224418919fSjohnjiang return -1;
2234418919fSjohnjiang if (test_cmdline_socket_fns() < 0)
2244418919fSjohnjiang return -1;
2254418919fSjohnjiang if (test_cmdline_fns() < 0)
2264418919fSjohnjiang return -1;
2274418919fSjohnjiang return 0;
2284418919fSjohnjiang }
229