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