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 = nullptr;
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,
42 "%s(vendor=%s, product=%s, version=%" PRIdz ", separator=%c) nullptr\n",
43 __func__, vendor, product, version, separator);
44 }
45 return wvendor;
46}
47
48static bool checkCombined(const char* what, const char* vendor, const char* product,
49 SSIZE_T version, char separator)
50{
51 if (!what || !vendor || !product)
52 {
53 (void)fprintf(stderr,
54 "%s(what=%s, vendor=%s, product=%s, version=%" PRIdz ", separator=%c)\n",
55 what, vendor, product, version, separator);
56 return false;
57 }
58
59 char* cmp = create(vendor, product, version, separator);
60 if (!cmp)
61 return false;
62
63 const bool rc = strcmp(what, cmp) == 0;
64 if (!rc)
65 {
66 (void)fprintf(stderr,
67 "%s(what=%s, vendor=%s, product=%s, version=%" PRIdz
68 ", separator=%c) -> got %s\n",
69 what, vendor, product, version, separator, cmp);
70 }
71 free(cmp);
72 return rc;
73}
74
75#if !defined(FREERDP_USE_VENDOR_PRODUCT_CONFIG_DIR)
76#if !defined(WITH_FULL_CONFIG_PATH)
77WINPR_ATTR_MALLOC(free, 1)
78WINPR_ATTR_NODISCARD
79static char* freerdp_settings_get_legacy_config_path(const char* filename, const char* cproduct)
80{
81 char product[MAX_PATH] = WINPR_C_ARRAY_INIT;
82
83 const size_t plen = strnlen(cproduct, sizeof(product));
84 if (plen == MAX_PATH)
85 return nullptr;
86
87 for (size_t i = 0; i < plen; i++)
88 product[i] = (char)tolower(cproduct[i]);
89
90 char* path = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product);
91
92 if (!path)
93 return nullptr;
94
95 if (!filename)
96 return path;
97
98 char* filepath = GetCombinedPath(path, filename);
99 free(path);
100 return filepath;
101}
102#endif
103
104WINPR_ATTR_MALLOC(free, 1)
105WINPR_ATTR_NODISCARD
106char* getFreeRDPDefaultConfig(BOOL system, const char* product, const char* vendor, SSIZE_T version,
107 const char* filename)
108{
109 eKnownPathTypes id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
110
111 if (!vendor || !product)
112 return nullptr;
113
114#if !defined(WITH_FULL_CONFIG_PATH)
115 if (!system && (_stricmp(vendor, product) == 0))
116 return freerdp_settings_get_legacy_config_path(filename, product);
117#endif
118
119 char* config = GetKnownPath(id);
120 if (!config)
121 return nullptr;
122
123 char* base = nullptr;
124 if (version < 0)
125 base = GetCombinedPathV(config, "%s", product);
126 else
127 base = GetCombinedPathV(config, "%s%" PRIdz, product, version);
128 free(config);
129
130 if (!base)
131 return nullptr;
132
133 if (!filename)
134 return base;
135
136 char* path = GetCombinedPathV(base, "%s", filename);
137 free(base);
138 return path;
139}
140#endif
141
142WINPR_ATTR_MALLOC(free, 1)
143WINPR_ATTR_NODISCARD
144static char* getFreeRDPConfig(bool custom, BOOL system, const char* vendor, const char* product,
145 SSIZE_T version, const char* filename)
146{
147#if !defined(FREERDP_USE_VENDOR_PRODUCT_CONFIG_DIR)
148 if (!custom)
149 return getFreeRDPDefaultConfig(system, vendor, product, version, filename);
150#endif
151 eKnownPathTypes id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
152 char* config = GetKnownSubPathV(id, "%s", vendor);
153 if (!config)
154 return nullptr;
155
156 char* base = nullptr;
157 if (version < 0)
158 base = GetCombinedPathV(config, "%s", product);
159 else
160 base = GetCombinedPathV(config, "%s%" PRIdz, product, version);
161 free(config);
162
163 if (!base)
164 return nullptr;
165 if (!filename)
166 return base;
167
168 char* path = GetCombinedPath(base, filename);
169 free(base);
170 return path;
171}
172
173WINPR_ATTR_NODISCARD
174static bool checkFreeRDPConfig(bool custom, const char* what, BOOL system, const char* vendor,
175 const char* product, SSIZE_T version, const char* filename)
176{
177 if (!what)
178 return false;
179 char* cmp = getFreeRDPConfig(custom, system, vendor, product, version, filename);
180 if (!cmp)
181 {
182 (void)fprintf(stderr,
183 "%s(custom=%d, what=%s, system=%d, vendor=%s, product=%s, version=%" PRIdz
184 ", file=%s) failed\n",
185 __func__, custom, what, system, vendor, product, version, filename);
186 return false;
187 }
188
189 const bool rc = strcmp(what, cmp) == 0;
190 if (!rc)
191 {
192 (void)fprintf(stderr,
193 "%s(custom=%d, what=%s, system=%d, vendor=%s, product=%s, version=%" PRIdz
194 ", file=%s) failed compare: got %s\n",
195 __func__, custom, what, system, vendor, product, version, filename, cmp);
196 }
197 free(cmp);
198 return rc;
199}
200
201static bool checkFreeRDPResults(bool custom, const char* vendor, const char* product,
202 SSIZE_T version)
203{
204 const char* cvendor = freerdp_getApplicationDetailsVendor();
205 const char* cproduct = freerdp_getApplicationDetailsProduct();
206 const SSIZE_T cversion = freerdp_getApplicationDetailsVersion();
207
208 if (!custom)
209 {
210#if !defined(WITH_RESOURCE_VERSIONING)
211 version = -1;
212#endif
213 }
214
215 if (strcmp(cvendor, vendor) != 0)
216 {
217 (void)fprintf(stderr, "freerdp_getApplicationDetailsVendor returned '%s', expected '%s'\n",
218 cvendor, vendor);
219 return false;
220 }
221 if (strcmp(cvendor, vendor) != 0)
222 {
223 (void)fprintf(stderr, "freerdp_getApplicationDetailsProduct returned '%s', expected '%s'\n",
224 cproduct, product);
225 return false;
226 }
227 if (cversion != version)
228 {
229 (void)fprintf(stderr,
230 "freerdp_getApplicationDetailsVersion returned %" PRIdz ", expected %" PRIdz
231 "\n",
232 cversion, version);
233 return false;
234 }
235
236 {
237 char* sys = freerdp_GetConfigFilePath(TRUE, nullptr);
238 const bool rc = checkFreeRDPConfig(custom, sys, TRUE, vendor, product, version, nullptr);
239 free(sys);
240 if (!rc)
241 return rc;
242 }
243 {
244 const char name[] = "systest";
245 char* sys = freerdp_GetConfigFilePath(TRUE, name);
246 const bool rc = checkFreeRDPConfig(custom, sys, TRUE, vendor, product, version, name);
247 free(sys);
248 if (!rc)
249 return rc;
250 }
251 {
252 char* sys = freerdp_GetConfigFilePath(FALSE, nullptr);
253 const bool rc = checkFreeRDPConfig(custom, sys, FALSE, vendor, product, version, nullptr);
254 free(sys);
255 if (!rc)
256 return rc;
257 }
258 {
259 const char name[] = "usertest";
260 char* sys = freerdp_GetConfigFilePath(FALSE, name);
261 const bool rc = checkFreeRDPConfig(custom, sys, FALSE, vendor, product, version, name);
262 free(sys);
263 if (!rc)
264 return rc;
265 }
266
267#if defined(BUILD_TESTING_INTERNAL)
268 {
269 char* pcmp = create(vendor, product, version, '\\');
270 if (!pcmp)
271 return false;
272 char* cmp = nullptr;
273 size_t clen = 0;
274#define FMT "foo\\bar\\%s\\gaga"
275 (void)winpr_asprintf(&cmp, &clen, FMT, pcmp);
276 free(pcmp);
277 if (!cmp)
278 {
279 (void)fprintf(stderr, "winpr_asprintf cmp nullptr\n");
280 return false;
281 }
282
283 char* comb = freerdp_getApplicatonDetailsRegKey(FMT);
284#undef FMT
285
286 bool rc = false;
287 if (comb)
288 {
289 rc = strcmp(cmp, comb) == 0;
290 if (!rc)
291 (void)fprintf(stderr, "strcmp(%s, %s) compare reg failed\n", cmp, comb);
292 }
293 free(comb);
294 free(cmp);
295
296 if (!rc)
297 return false;
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 nullptr;
334
335 char* base = nullptr;
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 nullptr;
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, nullptr);
403 const bool rc = checkWinPRConfig(sys, TRUE, vendor, product, version, nullptr);
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, nullptr);
417 const bool rc = checkWinPRConfig(sys, FALSE, vendor, product, version, nullptr);
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}