1 /* $OpenBSD: test_argv.c,v 1.3 2021/06/08 07:40:12 djm Exp $ */ 2 /* 3 * Regress test for misc argv handling functions. 4 * 5 * Placed in the public domain. 6 */ 7 8 #include <sys/types.h> 9 #include <sys/param.h> 10 #include <stdio.h> 11 #include <stdint.h> 12 #include <stdlib.h> 13 #include <string.h> 14 15 #include "test_helper.h" 16 17 #include "log.h" 18 #include "misc.h" 19 20 void test_argv(void); 21 22 void 23 test_argv(void) 24 { 25 char **av = NULL; 26 int ac = 0; 27 28 #define RESET_ARGV() \ 29 do { \ 30 argv_free(av, ac); \ 31 av = NULL; \ 32 ac = -1; \ 33 } while (0) 34 35 TEST_START("empty args"); 36 ASSERT_INT_EQ(argv_split("", &ac, &av, 0), 0); 37 ASSERT_INT_EQ(ac, 0); 38 ASSERT_PTR_NE(av, NULL); 39 ASSERT_PTR_EQ(av[0], NULL); 40 RESET_ARGV(); 41 ASSERT_INT_EQ(argv_split(" ", &ac, &av, 0), 0); 42 ASSERT_INT_EQ(ac, 0); 43 ASSERT_PTR_NE(av, NULL); 44 ASSERT_PTR_EQ(av[0], NULL); 45 RESET_ARGV(); 46 TEST_DONE(); 47 48 TEST_START("trivial args"); 49 ASSERT_INT_EQ(argv_split("leamas", &ac, &av, 0), 0); 50 ASSERT_INT_EQ(ac, 1); 51 ASSERT_PTR_NE(av, NULL); 52 ASSERT_STRING_EQ(av[0], "leamas"); 53 ASSERT_PTR_EQ(av[1], NULL); 54 RESET_ARGV(); 55 ASSERT_INT_EQ(argv_split("smiley leamas", &ac, &av, 0), 0); 56 ASSERT_INT_EQ(ac, 2); 57 ASSERT_PTR_NE(av, NULL); 58 ASSERT_STRING_EQ(av[0], "smiley"); 59 ASSERT_STRING_EQ(av[1], "leamas"); 60 ASSERT_PTR_EQ(av[2], NULL); 61 RESET_ARGV(); 62 TEST_DONE(); 63 64 TEST_START("quoted"); 65 ASSERT_INT_EQ(argv_split("\"smiley\"", &ac, &av, 0), 0); 66 ASSERT_INT_EQ(ac, 1); 67 ASSERT_PTR_NE(av, NULL); 68 ASSERT_STRING_EQ(av[0], "smiley"); 69 ASSERT_PTR_EQ(av[1], NULL); 70 RESET_ARGV(); 71 ASSERT_INT_EQ(argv_split("leamas \" smiley \"", &ac, &av, 0), 0); 72 ASSERT_INT_EQ(ac, 2); 73 ASSERT_PTR_NE(av, NULL); 74 ASSERT_STRING_EQ(av[0], "leamas"); 75 ASSERT_STRING_EQ(av[1], " smiley "); 76 ASSERT_PTR_EQ(av[2], NULL); 77 RESET_ARGV(); 78 ASSERT_INT_EQ(argv_split("\"smiley leamas\"", &ac, &av, 0), 0); 79 ASSERT_INT_EQ(ac, 1); 80 ASSERT_PTR_NE(av, NULL); 81 ASSERT_STRING_EQ(av[0], "smiley leamas"); 82 ASSERT_PTR_EQ(av[1], NULL); 83 RESET_ARGV(); 84 ASSERT_INT_EQ(argv_split("smiley\" leamas\" liz", &ac, &av, 0), 0); 85 ASSERT_INT_EQ(ac, 2); 86 ASSERT_PTR_NE(av, NULL); 87 ASSERT_STRING_EQ(av[0], "smiley leamas"); 88 ASSERT_STRING_EQ(av[1], "liz"); 89 ASSERT_PTR_EQ(av[2], NULL); 90 RESET_ARGV(); 91 TEST_DONE(); 92 93 TEST_START("escaped"); 94 ASSERT_INT_EQ(argv_split("\\\"smiley\\'", &ac, &av, 0), 0); 95 ASSERT_INT_EQ(ac, 1); 96 ASSERT_PTR_NE(av, NULL); 97 ASSERT_STRING_EQ(av[0], "\"smiley'"); 98 ASSERT_PTR_EQ(av[1], NULL); 99 RESET_ARGV(); 100 ASSERT_INT_EQ(argv_split("'\\'smiley\\\"'", &ac, &av, 0), 0); 101 ASSERT_INT_EQ(ac, 1); 102 ASSERT_PTR_NE(av, NULL); 103 ASSERT_STRING_EQ(av[0], "'smiley\""); 104 ASSERT_PTR_EQ(av[1], NULL); 105 RESET_ARGV(); 106 ASSERT_INT_EQ(argv_split("smiley\\'s leamas\\'", &ac, &av, 0), 0); 107 ASSERT_INT_EQ(ac, 2); 108 ASSERT_PTR_NE(av, NULL); 109 ASSERT_STRING_EQ(av[0], "smiley's"); 110 ASSERT_STRING_EQ(av[1], "leamas'"); 111 ASSERT_PTR_EQ(av[2], NULL); 112 RESET_ARGV(); 113 ASSERT_INT_EQ(argv_split("leamas\\\\smiley", &ac, &av, 0), 0); 114 ASSERT_INT_EQ(ac, 1); 115 ASSERT_PTR_NE(av, NULL); 116 ASSERT_STRING_EQ(av[0], "leamas\\smiley"); 117 ASSERT_PTR_EQ(av[1], NULL); 118 RESET_ARGV(); 119 ASSERT_INT_EQ(argv_split("leamas\\\\ \\\\smiley", &ac, &av, 0), 0); 120 ASSERT_INT_EQ(ac, 2); 121 ASSERT_PTR_NE(av, NULL); 122 ASSERT_STRING_EQ(av[0], "leamas\\"); 123 ASSERT_STRING_EQ(av[1], "\\smiley"); 124 ASSERT_PTR_EQ(av[2], NULL); 125 RESET_ARGV(); 126 ASSERT_INT_EQ(argv_split("smiley\\ leamas", &ac, &av, 0), 0); 127 ASSERT_INT_EQ(ac, 1); 128 ASSERT_PTR_NE(av, NULL); 129 ASSERT_STRING_EQ(av[0], "smiley leamas"); 130 ASSERT_PTR_EQ(av[1], NULL); 131 RESET_ARGV(); 132 TEST_DONE(); 133 134 TEST_START("quoted escaped"); 135 ASSERT_INT_EQ(argv_split("'smiley\\ leamas'", &ac, &av, 0), 0); 136 ASSERT_INT_EQ(ac, 1); 137 ASSERT_PTR_NE(av, NULL); 138 ASSERT_STRING_EQ(av[0], "smiley\\ leamas"); 139 ASSERT_PTR_EQ(av[1], NULL); 140 RESET_ARGV(); 141 ASSERT_INT_EQ(argv_split("\"smiley\\ leamas\"", &ac, &av, 0), 0); 142 ASSERT_INT_EQ(ac, 1); 143 ASSERT_PTR_NE(av, NULL); 144 ASSERT_STRING_EQ(av[0], "smiley\\ leamas"); 145 ASSERT_PTR_EQ(av[1], NULL); 146 RESET_ARGV(); 147 TEST_DONE(); 148 149 TEST_START("comments"); 150 ASSERT_INT_EQ(argv_split("# gold", &ac, &av, 0), 0); 151 ASSERT_INT_EQ(ac, 2); 152 ASSERT_PTR_NE(av, NULL); 153 ASSERT_STRING_EQ(av[0], "#"); 154 ASSERT_STRING_EQ(av[1], "gold"); 155 ASSERT_PTR_EQ(av[2], NULL); 156 RESET_ARGV(); 157 ASSERT_INT_EQ(argv_split("# gold", &ac, &av, 1), 0); 158 ASSERT_INT_EQ(ac, 0); 159 ASSERT_PTR_NE(av, NULL); 160 ASSERT_PTR_EQ(av[0], NULL); 161 RESET_ARGV(); 162 ASSERT_INT_EQ(argv_split("leamas#gold", &ac, &av, 1), 0); 163 ASSERT_INT_EQ(ac, 1); 164 ASSERT_PTR_NE(av, NULL); 165 ASSERT_STRING_EQ(av[0], "leamas#gold"); 166 ASSERT_PTR_EQ(av[1], NULL); 167 RESET_ARGV(); 168 ASSERT_INT_EQ(argv_split("\"leamas # gold\"", &ac, &av, 1), 0); 169 ASSERT_INT_EQ(ac, 1); 170 ASSERT_PTR_NE(av, NULL); 171 ASSERT_STRING_EQ(av[0], "leamas # gold"); 172 ASSERT_PTR_EQ(av[1], NULL); 173 RESET_ARGV(); 174 ASSERT_INT_EQ(argv_split("\"leamas\"#gold", &ac, &av, 1), 0); 175 ASSERT_INT_EQ(ac, 1); 176 ASSERT_PTR_NE(av, NULL); 177 ASSERT_STRING_EQ(av[0], "leamas#gold"); 178 ASSERT_PTR_EQ(av[1], NULL); 179 RESET_ARGV(); 180 TEST_DONE(); 181 182 /* XXX test char *argv_assemble(int argc, char **argv) */ 183 } 184