FreeRDP
Loading...
Searching...
No Matches
TestUtils.c
1#include <ctype.h>
2
3#include <winpr/version.h>
4#include <winpr/build-config.h>
5#include <winpr/path.h>
6#include <winpr/file.h>
7
8#include <freerdp/api.h>
9#include <freerdp/version.h>
10#include <freerdp/build-config.h>
11#include <freerdp/utils/helpers.h>
12
13#if defined(BUILD_TESTING_INTERNAL)
14#include "../utils.h"
15#endif
16
17typedef struct
18{
19 const char* vendor;
20 const char* product;
21 SSIZE_T version;
22} test_case_t;
23
24static const test_case_t tests[] = { { "foobar", "gaga", 23 },
25 { "foobar1", "gaga1", -1 },
26 { "foobar2", "gaga2", 23 },
27 { "foobar3", "gaga3", -1 } };
28
29WINPR_ATTR_MALLOC(free, 1)
30WINPR_ATTR_NODISCARD
31static char* create(const char* vendor, const char* product, SSIZE_T version, char separator)
32{
33 char* wvendor = NULL;
34 size_t wlen = 0;
35 if (version < 0)
36 (void)winpr_asprintf(&wvendor, &wlen, "%s%c%s", vendor, separator, product);
37 else
38 (void)winpr_asprintf(&wvendor, &wlen, "%s%c%s%" PRIdz, vendor, separator, product, version);
39 if (!wvendor)
40 {
41 (void)fprintf(stderr, "%s(vendor=%s, product=%s, version=%" PRIdz ", separator=%c) NULL\n",
42 __func__, vendor, product, version, separator);
43 }
44 return wvendor;
45}
46
47static bool checkCombined(const char* what, const char* vendor, const char* product,
48 SSIZE_T version, char separator)
49{
50 if (!what || !vendor || !product)
51 {
52 (void)fprintf(stderr,
53 "%s(what=%s, vendor=%s, product=%s, version=%" PRIdz ", separator=%c)\n",
54 what, vendor, product, version, separator);
55 return false;
56 }
57
58 char* cmp = create(vendor, product, version, separator);
59 if (!cmp)
60 return false;
61
62 const bool rc = strcmp(what, cmp) == 0;
63 if (!rc)
64 {
65 (void)fprintf(stderr,
66 "%s(what=%s, vendor=%s, product=%s, version=%" PRIdz
67 ", separator=%c) -> got %s\n",
68 what, vendor, product, version, separator, cmp);
69 }
70 free(cmp);
71 return rc;
72}
73
74#if !defined(FREERDP_USE_VENDOR_PRODUCT_CONFIG_DIR)
75#if !defined(WITH_FULL_CONFIG_PATH)
76WINPR_ATTR_MALLOC(free, 1)
77WINPR_ATTR_NODISCARD
78static char* freerdp_settings_get_legacy_config_path(const char* filename, const char* cproduct)
79{
80 char product[MAX_PATH] = { 0 };
81
82 const size_t plen = strnlen(cproduct, sizeof(product));
83 if (plen == MAX_PATH)
84 return NULL;
85
86 for (size_t i = 0; i < plen; i++)
87 product[i] = (char)tolower(cproduct[i]);
88
89 char* path = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product);
90
91 if (!path)
92 return NULL;
93
94 if (!filename)
95 return path;
96
97 char* filepath = GetCombinedPath(path, filename);
98 free(path);
99 return filepath;
100}
101#endif
102
103WINPR_ATTR_MALLOC(free, 1)
104WINPR_ATTR_NODISCARD
105char* getFreeRDPDefaultConfig(BOOL system, const char* product, const char* vendor, SSIZE_T version,
106 const char* filename)
107{
108 eKnownPathTypes id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
109
110 if (!vendor || !product)
111 return NULL;
112
113#if !defined(WITH_FULL_CONFIG_PATH)
114 if (!system && (_stricmp(vendor, product) == 0))
115 return freerdp_settings_get_legacy_config_path(filename, product);
116#endif
117
118 char* config = GetKnownPath(id);
119 if (!config)
120 return NULL;
121
122 char* base = NULL;
123 if (version < 0)
124 base = GetCombinedPathV(config, "%s", product);
125 else
126 base = GetCombinedPathV(config, "%s%" PRIdz, product, version);
127 free(config);
128
129 if (!base)
130 return NULL;
131
132 if (!filename)
133 return base;
134
135 char* path = GetCombinedPathV(base, "%s", filename);
136 free(base);
137 return path;
138}
139#endif
140
141WINPR_ATTR_MALLOC(free, 1)
142WINPR_ATTR_NODISCARD
143static char* getFreeRDPConfig(bool custom, BOOL system, const char* vendor, const char* product,
144 SSIZE_T version, const char* filename)
145{
146#if !defined(FREERDP_USE_VENDOR_PRODUCT_CONFIG_DIR)
147 if (!custom)
148 return getFreeRDPDefaultConfig(system, vendor, product, version, filename);
149#endif
150 eKnownPathTypes id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
151 char* config = GetKnownSubPathV(id, "%s", vendor);
152 if (!config)
153 return NULL;
154
155 char* base = NULL;
156 if (version < 0)
157 base = GetCombinedPathV(config, "%s", product);
158 else
159 base = GetCombinedPathV(config, "%s%" PRIdz, product, version);
160 free(config);
161
162 if (!base)
163 return NULL;
164 if (!filename)
165 return base;
166
167 char* path = GetCombinedPath(base, filename);
168 free(base);
169 return path;
170}
171
172WINPR_ATTR_NODISCARD
173static bool checkFreeRDPConfig(bool custom, const char* what, BOOL system, const char* vendor,
174 const char* product, SSIZE_T version, const char* filename)
175{
176 if (!what)
177 return false;
178 char* cmp = getFreeRDPConfig(custom, system, vendor, product, version, filename);
179 if (!cmp)
180 {
181 (void)fprintf(stderr,
182 "%s(custom=%d, what=%s, system=%d, vendor=%s, product=%s, version=%" PRIdz
183 ", file=%s) failed\n",
184 __func__, custom, what, system, vendor, product, version, filename);
185 return false;
186 }
187
188 const bool rc = strcmp(what, cmp) == 0;
189 if (!rc)
190 {
191 (void)fprintf(stderr,
192 "%s(custom=%d, what=%s, system=%d, vendor=%s, product=%s, version=%" PRIdz
193 ", file=%s) failed compare: got %s\n",
194 __func__, custom, what, system, vendor, product, version, filename, cmp);
195 }
196 free(cmp);
197 return rc;
198}
199
200static bool checkFreeRDPResults(bool custom, const char* vendor, const char* product,
201 SSIZE_T version)
202{
203 const char* cvendor = freerdp_getApplicationDetailsVendor();
204 const char* cproduct = freerdp_getApplicationDetailsProduct();
205 const SSIZE_T cversion = freerdp_getApplicationDetailsVersion();
206
207 if (!custom)
208 {
209#if !defined(WITH_RESOURCE_VERSIONING)
210 version = -1;
211#endif
212 }
213
214 if (strcmp(cvendor, vendor) != 0)
215 {
216 (void)fprintf(stderr, "freerdp_getApplicationDetailsVendor returned '%s', expected '%s'\n",
217 cvendor, vendor);
218 return false;
219 }
220 if (strcmp(cvendor, vendor) != 0)
221 {
222 (void)fprintf(stderr, "freerdp_getApplicationDetailsProduct returned '%s', expected '%s'\n",
223 cproduct, product);
224 return false;
225 }
226 if (cversion != version)
227 {
228 (void)fprintf(stderr,
229 "freerdp_getApplicationDetailsVersion returned %" PRIdz ", expected %" PRIdz
230 "\n",
231 cversion, version);
232 return false;
233 }
234
235 {
236 char* sys = freerdp_GetConfigFilePath(TRUE, NULL);
237 const bool rc = checkFreeRDPConfig(custom, sys, TRUE, vendor, product, version, NULL);
238 free(sys);
239 if (!rc)
240 return rc;
241 }
242 {
243 const char name[] = "systest";
244 char* sys = freerdp_GetConfigFilePath(TRUE, name);
245 const bool rc = checkFreeRDPConfig(custom, sys, TRUE, vendor, product, version, name);
246 free(sys);
247 if (!rc)
248 return rc;
249 }
250 {
251 char* sys = freerdp_GetConfigFilePath(FALSE, NULL);
252 const bool rc = checkFreeRDPConfig(custom, sys, FALSE, vendor, product, version, NULL);
253 free(sys);
254 if (!rc)
255 return rc;
256 }
257 {
258 const char name[] = "usertest";
259 char* sys = freerdp_GetConfigFilePath(FALSE, name);
260 const bool rc = checkFreeRDPConfig(custom, sys, FALSE, vendor, product, version, name);
261 free(sys);
262 if (!rc)
263 return rc;
264 }
265
266#if defined(BUILD_TESTING_INTERNAL)
267 {
268 char* pcmp = create(vendor, product, version, '\\');
269 if (!pcmp)
270 return false;
271 char* cmp = NULL;
272 size_t clen = 0;
273#define FMT "foo\\bar\\%s\\gaga"
274 (void)winpr_asprintf(&cmp, &clen, FMT, pcmp);
275 free(pcmp);
276 if (!cmp)
277 {
278 (void)fprintf(stderr, "winpr_asprintf cmp NULL\n");
279 return false;
280 }
281
282 char* comb = freerdp_getApplicatonDetailsRegKey(FMT);
283#undef FMT
284
285 bool rc = false;
286 if (comb)
287 {
288 rc = strcmp(cmp, comb) == 0;
289 }
290 free(comb);
291 free(cmp);
292
293 if (!rc)
294 {
295 (void)fprintf(stderr, "strcmp(%s, %s) compare reg failed\n", cmp, comb);
296 return false;
297 }
298 }
299 {
300 char* comb = freerdp_getApplicatonDetailsCombined('/');
301 const bool rc = checkCombined(comb, vendor, product, version, '/');
302 free(comb);
303 if (!rc)
304 return false;
305 }
306 {
307 char* comb = freerdp_getApplicatonDetailsCombined('\\');
308 const bool rc = checkCombined(comb, vendor, product, version, '\\');
309 free(comb);
310 if (!rc)
311 return false;
312 }
313 const BOOL ccustom = freerdp_areApplicationDetailsCustomized();
314 if (ccustom != custom)
315 {
316 (void)fprintf(stderr, "freerdp_areApplicationDetailsCustomized returned %d, expected%d\n",
317 ccustom, custom);
318 return false;
319 }
320#endif
321
322 return true;
323}
324
325WINPR_ATTR_MALLOC(free, 1)
326WINPR_ATTR_NODISCARD
327static char* getWinPRConfig(BOOL system, const char* vendor, const char* product, SSIZE_T version,
328 const char* filename)
329{
330 eKnownPathTypes id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
331 char* config = GetKnownSubPathV(id, "%s", vendor);
332 if (!config)
333 return NULL;
334
335 char* base = NULL;
336 if (version < 0)
337 base = GetCombinedPathV(config, "%s", product);
338 else
339 base = GetCombinedPathV(config, "%s%" PRIdz, product, version);
340 free(config);
341
342 if (!base)
343 return NULL;
344 if (!filename)
345 return base;
346
347 char* path = GetCombinedPath(base, filename);
348 free(base);
349 return path;
350}
351
352WINPR_ATTR_NODISCARD
353static bool checkWinPRConfig(const char* what, BOOL system, const char* vendor, const char* product,
354 SSIZE_T version, const char* filename)
355{
356 if (!what)
357 return false;
358 char* cmp = getWinPRConfig(system, vendor, product, version, filename);
359 if (!cmp)
360 return false;
361
362 const bool rc = strcmp(what, cmp) == 0;
363 free(cmp);
364 return rc;
365}
366
367WINPR_ATTR_NODISCARD
368static bool checkWinPRResults(bool custom, const char* vendor, const char* product, SSIZE_T version)
369{
370 const char* cvendor = winpr_getApplicationDetailsVendor();
371 const char* cproduct = winpr_getApplicationDetailsProduct();
372 const SSIZE_T cversion = winpr_getApplicationDetailsVersion();
373
374 if (!custom)
375 {
376#if !defined(WITH_RESOURCE_VERSIONING)
377 version = -1;
378#endif
379 }
380
381 if (strcmp(cvendor, vendor) != 0)
382 {
383 (void)fprintf(stderr, "winpr_getApplicationDetailsVendor returned '%s', expected '%s'\n",
384 cvendor, vendor);
385 return false;
386 }
387 if (strcmp(cvendor, vendor) != 0)
388 {
389 (void)fprintf(stderr, "winpr_getApplicationDetailsProduct returned '%s', expected '%s'\n",
390 cproduct, product);
391 return false;
392 }
393 if (cversion != version)
394 {
395 (void)fprintf(
396 stderr, "winpr_getApplicationDetailsVersion returned %" PRIdz ", expected %" PRIdz "\n",
397 cversion, version);
398 return false;
399 }
400
401 {
402 char* sys = winpr_GetConfigFilePath(TRUE, NULL);
403 const bool rc = checkWinPRConfig(sys, TRUE, vendor, product, version, NULL);
404 free(sys);
405 if (!rc)
406 return rc;
407 }
408 {
409 char* sys = winpr_GetConfigFilePath(TRUE, "systest");
410 const bool rc = checkWinPRConfig(sys, TRUE, vendor, product, version, "systest");
411 free(sys);
412 if (!rc)
413 return rc;
414 }
415 {
416 char* sys = winpr_GetConfigFilePath(FALSE, NULL);
417 const bool rc = checkWinPRConfig(sys, FALSE, vendor, product, version, NULL);
418 free(sys);
419 if (!rc)
420 return rc;
421 }
422 {
423 char* sys = winpr_GetConfigFilePath(FALSE, "usertest");
424 const bool rc = checkWinPRConfig(sys, FALSE, vendor, product, version, "usertest");
425 free(sys);
426 if (!rc)
427 return rc;
428 }
429
430 return true;
431}
432
433int TestUtils(WINPR_ATTR_UNUSED int argc, WINPR_ATTR_UNUSED char* argv[])
434{
435 int rc = -23;
436
437 if (!checkWinPRResults(false, WINPR_VENDOR_STRING, WINPR_PRODUCT_STRING, WINPR_VERSION_MAJOR))
438 {
439 rc = -1;
440 goto fail;
441 }
442 if (!checkFreeRDPResults(false, FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING,
443 FREERDP_VERSION_MAJOR))
444 {
445 rc = -2;
446 goto fail;
447 }
448
449 for (size_t x = 0; x < ARRAYSIZE(tests); x++)
450 {
451 const test_case_t* cur = &tests[x];
452
453 if (!freerdp_setApplicationDetails(cur->vendor, cur->product, cur->version))
454 {
455 (void)fprintf(stderr, "freerdp_setApplicationDetails(%s, %s, %" PRIdz ") failed\n",
456 cur->vendor, cur->product, cur->version);
457 {
458 rc = -3;
459 goto fail;
460 }
461 }
462
463 const char separator = PathGetSeparatorA(PATH_STYLE_NATIVE);
464#if defined(BUILD_TESTING_INTERNAL)
465 char* wvendor = freerdp_getApplicatonDetailsCombined(separator);
466#else
467 char* wvendor = create(cur->vendor, cur->product, cur->version, separator);
468#endif
469 if (!wvendor)
470 {
471 rc = -4;
472 goto fail;
473 }
474 const BOOL wrc = checkWinPRResults(true, wvendor, "WinPR", -1);
475 free(wvendor);
476 if (!wrc)
477 {
478 rc = -5;
479 goto fail;
480 }
481 if (!checkFreeRDPResults(true, cur->vendor, cur->product, cur->version))
482 {
483 rc = -6;
484 goto fail;
485 }
486 }
487
488 rc = 0;
489fail:
490 printf("%s: result %d\n", __func__, rc);
491 return rc;
492}