FreeRDP
Loading...
Searching...
No Matches
TestAddinArgv.c
1#include <winpr/crt.h>
2#include <winpr/crypto.h>
3
4#include <freerdp/settings.h>
5
6static BOOL test_alloc(void)
7{
8 BOOL rc = FALSE;
9 int rng = 0;
10 const char* param[] = { "foo:", "bar", "bla", "rdp", nullptr };
11 ADDIN_ARGV* arg1 = nullptr;
12 ADDIN_ARGV* arg2 = nullptr;
13 ADDIN_ARGV* arg3 = nullptr;
14 ADDIN_ARGV* arg4 = nullptr;
15
16 /* Test empty allocation */
17 arg1 = freerdp_addin_argv_new(0, nullptr);
18 if (!arg1 || (arg1->argc != 0) || (arg1->argv))
19 goto fail;
20
21 /* Test allocation without initializing arguments of random size > 0 */
22 if (winpr_RAND(&rng, sizeof(rng)) < 0)
23 goto fail;
24 rng = abs(rng % 8192) + 1;
25
26 arg2 = freerdp_addin_argv_new(rng, nullptr);
27 if (!arg2 || (arg2->argc != rng) || (!arg2->argv))
28 goto fail;
29 for (int x = 0; x < arg2->argc; x++)
30 {
31 if (arg2->argv[x])
32 goto fail;
33 }
34
35 /* Test allocation with initializing arguments of size > 0 */
36 arg3 = freerdp_addin_argv_new(ARRAYSIZE(param) - 1, param);
37 if (!arg3 || (arg3->argc != ARRAYSIZE(param) - 1) || (!arg3->argv))
38 goto fail;
39
40 for (int x = 0; x < arg3->argc; x++)
41 {
42 if (strcmp(arg3->argv[x], param[x]) != 0)
43 goto fail;
44 }
45
46 /* Input lists with nullptr elements are not allowed */
47 arg4 = freerdp_addin_argv_new(ARRAYSIZE(param), param);
48 if (arg4)
49 goto fail;
50 rc = TRUE;
51fail:
52 freerdp_addin_argv_free(arg1);
53 freerdp_addin_argv_free(arg2);
54 freerdp_addin_argv_free(arg3);
55 freerdp_addin_argv_free(arg4);
56 printf("%s: %d\n", __func__, rc);
57 return rc;
58}
59
60static BOOL test_clone(void)
61{
62 BOOL rc = FALSE;
63 const char* param[] = { "foo:", "bar", "bla", "rdp" };
64 ADDIN_ARGV* arg = nullptr;
65 ADDIN_ARGV* clone = nullptr;
66 ADDIN_ARGV* clone2 = nullptr;
67
68 arg = freerdp_addin_argv_new(ARRAYSIZE(param), param);
69 if (!arg || (arg->argc != ARRAYSIZE(param)))
70 goto fail;
71 clone = freerdp_addin_argv_clone(arg);
72 if (!clone || (clone->argc != arg->argc))
73 goto fail;
74
75 for (int x = 0; x < arg->argc; x++)
76 {
77 if (strcmp(param[x], arg->argv[x]) != 0)
78 goto fail;
79 if (strcmp(param[x], clone->argv[x]) != 0)
80 goto fail;
81 }
82
83 clone2 = freerdp_addin_argv_clone(nullptr);
84 if (clone2)
85 goto fail;
86 rc = TRUE;
87fail:
88 freerdp_addin_argv_free(arg);
89 freerdp_addin_argv_free(clone);
90 freerdp_addin_argv_free(clone2);
91 printf("%s: %d\n", __func__, rc);
92 return rc;
93}
94
95static BOOL test_add_remove(void)
96{
97 const char* args[] = { "foo", "bar", "bla", "gaga" };
98 BOOL rc = FALSE;
99 ADDIN_ARGV* arg = freerdp_addin_argv_new(0, nullptr);
100
101 if (!arg || (arg->argc != 0) || arg->argv)
102 goto fail;
103 for (size_t y = 0; y < ARRAYSIZE(args); y++)
104 {
105 const char* param = args[y];
106 if (!freerdp_addin_argv_add_argument(arg, param))
107 goto fail;
108 if (arg->argc != (int)y + 1)
109 goto fail;
110 if (!arg->argv)
111 goto fail;
112 if (strcmp(arg->argv[y], param) != 0)
113 goto fail;
114 }
115
116 /* Try to remove non existing element, must not return TRUE */
117 if (freerdp_addin_argv_del_argument(arg, "foobar"))
118 goto fail;
119
120 /* Invalid parameters, must return FALSE */
121 if (freerdp_addin_argv_del_argument(nullptr, "foobar"))
122 goto fail;
123
124 /* Invalid parameters, must return FALSE */
125 if (freerdp_addin_argv_del_argument(arg, nullptr))
126 goto fail;
127
128 /* Remove elements one by one to test argument index move */
129 for (size_t y = 0; y < ARRAYSIZE(args); y++)
130 {
131 const char* param = args[y];
132 if (!freerdp_addin_argv_del_argument(arg, param))
133 goto fail;
134 for (size_t x = y + 1; x < ARRAYSIZE(args); x++)
135 {
136 if (strcmp(arg->argv[x - y - 1], args[x]) != 0)
137 goto fail;
138 }
139 }
140 rc = TRUE;
141fail:
142 freerdp_addin_argv_free(arg);
143 printf("%s: %d\n", __func__, rc);
144 return rc;
145}
146
147static BOOL test_set_argument(void)
148{
149 int ret = 0;
150 const char* newarg = "foobar";
151 const char* args[] = { "foo", "bar", "bla", "gaga" };
152 BOOL rc = FALSE;
153 ADDIN_ARGV* arg = nullptr;
154
155 arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
156 if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
157 goto fail;
158
159 /* Check invalid parameters */
160 ret = freerdp_addin_set_argument(nullptr, "foo");
161 if (ret >= 0)
162 goto fail;
163 ret = freerdp_addin_set_argument(arg, nullptr);
164 if (ret >= 0)
165 goto fail;
166
167 /* Try existing parameter */
168 ret = freerdp_addin_set_argument(arg, "foo");
169 if ((ret != 1) || (arg->argc != ARRAYSIZE(args)))
170 goto fail;
171
172 /* Try new parameter */
173 ret = freerdp_addin_set_argument(arg, newarg);
174 if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
175 (strcmp(newarg, arg->argv[ARRAYSIZE(args)]) != 0))
176 goto fail;
177
178 rc = TRUE;
179fail:
180 freerdp_addin_argv_free(arg);
181 printf("%s: %d\n", __func__, rc);
182 return rc;
183}
184
185static BOOL test_replace_argument(void)
186{
187 int ret = 0;
188 const char* newarg = "foobar";
189 const char* args[] = { "foo", "bar", "bla", "gaga" };
190 BOOL rc = FALSE;
191 ADDIN_ARGV* arg = nullptr;
192
193 arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
194 if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
195 goto fail;
196
197 /* Check invalid parameters */
198 ret = freerdp_addin_replace_argument(nullptr, "foo", newarg);
199 if (ret >= 0)
200 goto fail;
201 ret = freerdp_addin_replace_argument(arg, nullptr, newarg);
202 if (ret >= 0)
203 goto fail;
204 ret = freerdp_addin_replace_argument(arg, "foo", nullptr);
205 if (ret >= 0)
206 goto fail;
207
208 /* Try existing parameter */
209 ret = freerdp_addin_replace_argument(arg, "foo", newarg);
210 if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[0], newarg) != 0))
211 goto fail;
212
213 /* Try new parameter */
214 ret = freerdp_addin_replace_argument(arg, "lalala", newarg);
215 if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
216 (strcmp(newarg, arg->argv[ARRAYSIZE(args)]) != 0))
217 goto fail;
218
219 rc = TRUE;
220fail:
221 freerdp_addin_argv_free(arg);
222 printf("%s: %d\n", __func__, rc);
223 return rc;
224}
225
226static BOOL test_set_argument_value(void)
227{
228 int ret = 0;
229 const char* newarg1 = "foobar";
230 const char* newarg2 = "lalala";
231 const char* fullnewarg1 = "foo:foobar";
232 const char* fullnewarg2 = "foo:lalala";
233 const char* fullnewvalue = "lalala:foobar";
234 const char* args[] = { "foo", "foo:", "bar", "bla", "gaga" };
235 BOOL rc = FALSE;
236 ADDIN_ARGV* arg = nullptr;
237
238 arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
239 if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
240 goto fail;
241
242 /* Check invalid parameters */
243 ret = freerdp_addin_set_argument_value(nullptr, "foo", newarg1);
244 if (ret >= 0)
245 goto fail;
246 ret = freerdp_addin_set_argument_value(arg, nullptr, newarg1);
247 if (ret >= 0)
248 goto fail;
249 ret = freerdp_addin_set_argument_value(arg, "foo", nullptr);
250 if (ret >= 0)
251 goto fail;
252
253 /* Try existing parameter */
254 ret = freerdp_addin_set_argument_value(arg, "foo", newarg1);
255 if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[1], fullnewarg1) != 0))
256 goto fail;
257 ret = freerdp_addin_set_argument_value(arg, "foo", newarg2);
258 if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[1], fullnewarg2) != 0))
259 goto fail;
260
261 /* Try new parameter */
262 ret = freerdp_addin_set_argument_value(arg, newarg2, newarg1);
263 if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
264 (strcmp(fullnewvalue, arg->argv[ARRAYSIZE(args)]) != 0))
265 goto fail;
266
267 rc = TRUE;
268fail:
269 freerdp_addin_argv_free(arg);
270 printf("%s: %d\n", __func__, rc);
271 return rc;
272}
273
274static BOOL test_replace_argument_value(void)
275{
276 int ret = 0;
277 const char* newarg1 = "foobar";
278 const char* newarg2 = "lalala";
279 const char* fullnewarg1 = "foo:foobar";
280 const char* fullnewarg2 = "foo:lalala";
281 const char* fullnewvalue = "lalala:foobar";
282 const char* args[] = { "foo", "foo:", "bar", "bla", "gaga" };
283 BOOL rc = FALSE;
284 ADDIN_ARGV* arg = nullptr;
285
286 arg = freerdp_addin_argv_new(ARRAYSIZE(args), args);
287 if (!arg || (arg->argc != ARRAYSIZE(args)) || !arg->argv)
288 goto fail;
289
290 /* Check invalid parameters */
291 ret = freerdp_addin_replace_argument_value(nullptr, "bar", "foo", newarg1);
292 if (ret >= 0)
293 goto fail;
294 ret = freerdp_addin_replace_argument_value(arg, nullptr, "foo", newarg1);
295 if (ret >= 0)
296 goto fail;
297 ret = freerdp_addin_replace_argument_value(arg, "foo", nullptr, newarg1);
298 if (ret >= 0)
299 goto fail;
300 ret = freerdp_addin_replace_argument_value(arg, "bar", "foo", nullptr);
301 if (ret >= 0)
302 goto fail;
303
304 /* Try existing parameter */
305 ret = freerdp_addin_replace_argument_value(arg, "bla", "foo", newarg1);
306 if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[3], fullnewarg1) != 0))
307 goto fail;
308 ret = freerdp_addin_replace_argument_value(arg, "foo", "foo", newarg2);
309 if ((ret != 1) || (arg->argc != ARRAYSIZE(args)) || (strcmp(arg->argv[0], fullnewarg2) != 0))
310 goto fail;
311
312 /* Try new parameter */
313 ret = freerdp_addin_replace_argument_value(arg, "hahaha", newarg2, newarg1);
314 if ((ret != 0) || (arg->argc != ARRAYSIZE(args) + 1) ||
315 (strcmp(fullnewvalue, arg->argv[ARRAYSIZE(args)]) != 0))
316 goto fail;
317
318 rc = TRUE;
319fail:
320 freerdp_addin_argv_free(arg);
321 printf("%s: %d\n", __func__, rc);
322 return rc;
323}
324
325int TestAddinArgv(int argc, char* argv[])
326{
327
328 WINPR_UNUSED(argc);
329 WINPR_UNUSED(argv);
330
331 if (!test_alloc())
332 return -1;
333 if (!test_clone())
334 return -1;
335 if (!test_add_remove())
336 return -1;
337 if (!test_set_argument())
338 return -1;
339 if (!test_replace_argument())
340 return -1;
341 if (!test_set_argument_value())
342 return -1;
343 if (!test_replace_argument_value())
344 return -1;
345 return 0;
346}