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