xref: /openbsd-src/regress/usr.bin/ssh/unittests/misc/test_argv.c (revision d0fc3bb68efd6c434b4053cd7adb29023cbec341)
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