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 rdl = rdline_new(NULL, v, c, NULL); 92 if (rdl != NULL) 93 goto error; 94 rdl = rdline_new(wc, NULL, c, NULL); 95 if (rdl != NULL) 96 goto error; 97 rdl = rdline_new(wc, v, NULL, NULL); 98 if (rdl != NULL) 99 goto error; 100 if (rdline_char_in(NULL, 0) >= 0) 101 goto error; 102 if (rdline_get_buffer(NULL) != NULL) 103 goto error; 104 if (rdline_add_history(NULL, "history") >= 0) 105 goto error; 106 if (rdline_add_history(rdl, NULL) >= 0) 107 goto error; 108 if (rdline_get_history_item(NULL, 0) != NULL) 109 goto error; 110 111 /* void functions */ 112 rdline_get_history_buffer_size(NULL); 113 rdline_get_opaque(NULL); 114 rdline_newline(NULL, "prompt"); 115 rdline_newline(rdl, NULL); 116 rdline_stop(NULL); 117 rdline_quit(NULL); 118 rdline_restart(NULL); 119 rdline_redisplay(NULL); 120 rdline_reset(NULL); 121 rdline_clear_history(NULL); 122 rdline_free(NULL); 123 124 rdline_free(rdl); 125 return 0; 126 127 error: 128 printf("Error: function accepted null parameter!\n"); 129 rdline_free(rdl); 130 return -1; 131 } 132 133 static int 134 test_cmdline_vt100_fns(void) 135 { 136 if (vt100_parser(NULL, 0) >= 0) { 137 printf("Error: function accepted null parameter!\n"); 138 return -1; 139 } 140 141 /* void functions */ 142 vt100_init(NULL); 143 144 return 0; 145 } 146 147 static int 148 test_cmdline_socket_fns(void) 149 { 150 cmdline_parse_ctx_t ctx; 151 struct cmdline *cl; 152 153 cl = cmdline_stdin_new(NULL, "prompt"); 154 if (cl != NULL) 155 goto error; 156 cl = cmdline_stdin_new(&ctx, NULL); 157 if (cl != NULL) 158 goto error; 159 cl = cmdline_file_new(NULL, "prompt", "/dev/null"); 160 if (cl != NULL) 161 goto error; 162 cl = cmdline_file_new(&ctx, NULL, "/dev/null"); 163 if (cl != NULL) 164 goto error; 165 cl = cmdline_file_new(&ctx, "prompt", NULL); 166 if (cl != NULL) 167 goto error; 168 cl = cmdline_file_new(&ctx, "prompt", "-/invalid/~/path"); 169 if (cl != NULL) { 170 printf("Error: succeeded in opening invalid file for reading!"); 171 cmdline_free(cl); 172 return -1; 173 } 174 cl = cmdline_file_new(&ctx, "prompt", "/dev/null"); 175 if (cl == NULL) { 176 printf("Error: failed to open /dev/null for reading!"); 177 return -1; 178 } 179 180 /* void functions */ 181 cmdline_stdin_exit(NULL); 182 183 return 0; 184 error: 185 printf("Error: function accepted null parameter!\n"); 186 cmdline_free(cl); 187 return -1; 188 } 189 190 static int 191 test_cmdline_fns(void) 192 { 193 cmdline_parse_ctx_t ctx; 194 struct cmdline *cl; 195 196 memset(&ctx, 0, sizeof(ctx)); 197 cl = cmdline_new(NULL, "prompt", 0, 0); 198 if (cl != NULL) 199 goto error; 200 cl = cmdline_new(&ctx, NULL, 0, 0); 201 if (cl != NULL) 202 goto error; 203 cl = cmdline_new(&ctx, "test", -1, -1); 204 if (cl == NULL) 205 goto error; 206 if (cmdline_in(NULL, "buffer", CMDLINE_TEST_BUFSIZE) >= 0) 207 goto error; 208 if (cmdline_in(cl, NULL, CMDLINE_TEST_BUFSIZE) >= 0) 209 goto error; 210 if (cmdline_write_char(NULL, 0) >= 0) 211 goto error; 212 213 /* void functions */ 214 cmdline_set_prompt(NULL, "prompt"); 215 cmdline_free(NULL); 216 cmdline_printf(NULL, "format"); 217 cmdline_interact(NULL); 218 cmdline_quit(NULL); 219 220 cmdline_free(cl); 221 return 0; 222 223 error: 224 printf("Error: function accepted null parameter!\n"); 225 if (cl != NULL) 226 cmdline_free(cl); 227 return -1; 228 } 229 230 /* test library functions. the point of these tests is not so much to test 231 * functions' behaviour as it is to make sure there are no segfaults if 232 * they are called with invalid parameters. 233 */ 234 int 235 test_cmdline_lib(void) 236 { 237 if (test_cmdline_parse_fns() < 0) 238 return -1; 239 if (test_cmdline_rdline_fns() < 0) 240 return -1; 241 if (test_cmdline_vt100_fns() < 0) 242 return -1; 243 if (test_cmdline_socket_fns() < 0) 244 return -1; 245 if (test_cmdline_fns() < 0) 246 return -1; 247 return 0; 248 } 249