3#include <winpr/version.h>
4#include <winpr/build-config.h>
8#include <freerdp/api.h>
9#include <freerdp/version.h>
10#include <freerdp/build-config.h>
11#include <freerdp/utils/helpers.h>
13#if defined(BUILD_TESTING_INTERNAL)
24static const test_case_t tests[] = { {
"foobar",
"gaga", 23 },
25 {
"foobar1",
"gaga1", -1 },
26 {
"foobar2",
"gaga2", 23 },
27 {
"foobar3",
"gaga3", -1 } };
29WINPR_ATTR_MALLOC(free, 1)
31static
char* create(const
char* vendor, const
char* product, SSIZE_T version,
char separator)
33 char* wvendor =
nullptr;
36 (void)winpr_asprintf(&wvendor, &wlen,
"%s%c%s", vendor, separator, product);
38 (
void)winpr_asprintf(&wvendor, &wlen,
"%s%c%s%" PRIdz, vendor, separator, product, version);
42 "%s(vendor=%s, product=%s, version=%" PRIdz
", separator=%c) nullptr\n",
43 __func__, vendor, product, version, separator);
48static bool checkCombined(
const char* what,
const char* vendor,
const char* product,
49 SSIZE_T version,
char separator)
51 if (!what || !vendor || !product)
54 "%s(what=%s, vendor=%s, product=%s, version=%" PRIdz
", separator=%c)\n",
55 what, vendor, product, version, separator);
59 char* cmp = create(vendor, product, version, separator);
63 const bool rc = strcmp(what, cmp) == 0;
67 "%s(what=%s, vendor=%s, product=%s, version=%" PRIdz
68 ", separator=%c) -> got %s\n",
69 what, vendor, product, version, separator, cmp);
75#if !defined(FREERDP_USE_VENDOR_PRODUCT_CONFIG_DIR)
76#if !defined(WITH_FULL_CONFIG_PATH)
77WINPR_ATTR_MALLOC(free, 1)
79static
char* freerdp_settings_get_legacy_config_path(const
char* filename, const
char* cproduct)
81 char product[MAX_PATH] = WINPR_C_ARRAY_INIT;
83 const size_t plen = strnlen(cproduct,
sizeof(product));
87 for (
size_t i = 0; i < plen; i++)
88 product[i] = (
char)tolower(cproduct[i]);
90 char* path = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product);
98 char* filepath = GetCombinedPath(path, filename);
104WINPR_ATTR_MALLOC(free, 1)
106char* getFreeRDPDefaultConfig(BOOL system, const
char* product, const
char* vendor, SSIZE_T version,
107 const
char* filename)
109 eKnownPathTypes
id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
111 if (!vendor || !product)
114#if !defined(WITH_FULL_CONFIG_PATH)
115 if (!system && (_stricmp(vendor, product) == 0))
116 return freerdp_settings_get_legacy_config_path(filename, product);
119 char* config = GetKnownPath(
id);
123 char* base =
nullptr;
125 base = GetCombinedPathV(config,
"%s", product);
127 base = GetCombinedPathV(config,
"%s%" PRIdz, product, version);
136 char* path = GetCombinedPathV(base,
"%s", filename);
142WINPR_ATTR_MALLOC(free, 1)
144static
char* getFreeRDPConfig(
bool custom, BOOL system, const
char* vendor, const
char* product,
145 SSIZE_T version, const
char* filename)
147#if !defined(FREERDP_USE_VENDOR_PRODUCT_CONFIG_DIR)
149 return getFreeRDPDefaultConfig(system, vendor, product, version, filename);
151 eKnownPathTypes
id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
152 char* config = GetKnownSubPathV(
id,
"%s", vendor);
156 char* base =
nullptr;
158 base = GetCombinedPathV(config,
"%s", product);
160 base = GetCombinedPathV(config,
"%s%" PRIdz, product, version);
168 char* path = GetCombinedPath(base, filename);
174static bool checkFreeRDPConfig(
bool custom,
const char* what, BOOL system,
const char* vendor,
175 const char* product, SSIZE_T version,
const char* filename)
179 char* cmp = getFreeRDPConfig(custom, system, vendor, product, version, filename);
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);
189 const bool rc = strcmp(what, cmp) == 0;
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);
201static bool checkFreeRDPResults(
bool custom,
const char* vendor,
const char* product,
204 const char* cvendor = freerdp_getApplicationDetailsVendor();
205 const char* cproduct = freerdp_getApplicationDetailsProduct();
206 const SSIZE_T cversion = freerdp_getApplicationDetailsVersion();
210#if !defined(WITH_RESOURCE_VERSIONING)
215 if (strcmp(cvendor, vendor) != 0)
217 (void)fprintf(stderr,
"freerdp_getApplicationDetailsVendor returned '%s', expected '%s'\n",
221 if (strcmp(cvendor, vendor) != 0)
223 (void)fprintf(stderr,
"freerdp_getApplicationDetailsProduct returned '%s', expected '%s'\n",
227 if (cversion != version)
229 (void)fprintf(stderr,
230 "freerdp_getApplicationDetailsVersion returned %" PRIdz
", expected %" PRIdz
237 char* sys = freerdp_GetConfigFilePath(TRUE,
nullptr);
238 const bool rc = checkFreeRDPConfig(custom, sys, TRUE, vendor, product, version,
nullptr);
244 const char name[] =
"systest";
245 char* sys = freerdp_GetConfigFilePath(TRUE, name);
246 const bool rc = checkFreeRDPConfig(custom, sys, TRUE, vendor, product, version, name);
252 char* sys = freerdp_GetConfigFilePath(FALSE,
nullptr);
253 const bool rc = checkFreeRDPConfig(custom, sys, FALSE, vendor, product, version,
nullptr);
259 const char name[] =
"usertest";
260 char* sys = freerdp_GetConfigFilePath(FALSE, name);
261 const bool rc = checkFreeRDPConfig(custom, sys, FALSE, vendor, product, version, name);
267#if defined(BUILD_TESTING_INTERNAL)
269 char* pcmp = create(vendor, product, version,
'\\');
274#define FMT "foo\\bar\\%s\\gaga"
275 (void)winpr_asprintf(&cmp, &clen, FMT, pcmp);
279 (void)fprintf(stderr,
"winpr_asprintf cmp nullptr\n");
283 char* comb = freerdp_getApplicatonDetailsRegKey(FMT);
289 rc = strcmp(cmp, comb) == 0;
291 (void)fprintf(stderr,
"strcmp(%s, %s) compare reg failed\n", cmp, comb);
300 char* comb = freerdp_getApplicatonDetailsCombined(
'/');
301 const bool rc = checkCombined(comb, vendor, product, version,
'/');
307 char* comb = freerdp_getApplicatonDetailsCombined(
'\\');
308 const bool rc = checkCombined(comb, vendor, product, version,
'\\');
313 const BOOL ccustom = freerdp_areApplicationDetailsCustomized();
314 if (ccustom != custom)
316 (void)fprintf(stderr,
"freerdp_areApplicationDetailsCustomized returned %d, expected%d\n",
325WINPR_ATTR_MALLOC(free, 1)
327static
char* getWinPRConfig(BOOL system, const
char* vendor, const
char* product, SSIZE_T version,
328 const
char* filename)
330 eKnownPathTypes
id = system ? KNOWN_PATH_SYSTEM_CONFIG_HOME : KNOWN_PATH_XDG_CONFIG_HOME;
331 char* config = GetKnownSubPathV(
id,
"%s", vendor);
335 char* base =
nullptr;
337 base = GetCombinedPathV(config,
"%s", product);
339 base = GetCombinedPathV(config,
"%s%" PRIdz, product, version);
347 char* path = GetCombinedPath(base, filename);
353static bool checkWinPRConfig(
const char* what, BOOL system,
const char* vendor,
const char* product,
354 SSIZE_T version,
const char* filename)
358 char* cmp = getWinPRConfig(system, vendor, product, version, filename);
362 const bool rc = strcmp(what, cmp) == 0;
368static bool checkWinPRResults(
bool custom,
const char* vendor,
const char* product, SSIZE_T version)
370 const char* cvendor = winpr_getApplicationDetailsVendor();
371 const char* cproduct = winpr_getApplicationDetailsProduct();
372 const SSIZE_T cversion = winpr_getApplicationDetailsVersion();
376#if !defined(WITH_RESOURCE_VERSIONING)
381 if (strcmp(cvendor, vendor) != 0)
383 (void)fprintf(stderr,
"winpr_getApplicationDetailsVendor returned '%s', expected '%s'\n",
387 if (strcmp(cvendor, vendor) != 0)
389 (void)fprintf(stderr,
"winpr_getApplicationDetailsProduct returned '%s', expected '%s'\n",
393 if (cversion != version)
396 stderr,
"winpr_getApplicationDetailsVersion returned %" PRIdz
", expected %" PRIdz
"\n",
402 char* sys = winpr_GetConfigFilePath(TRUE,
nullptr);
403 const bool rc = checkWinPRConfig(sys, TRUE, vendor, product, version,
nullptr);
409 char* sys = winpr_GetConfigFilePath(TRUE,
"systest");
410 const bool rc = checkWinPRConfig(sys, TRUE, vendor, product, version,
"systest");
416 char* sys = winpr_GetConfigFilePath(FALSE,
nullptr);
417 const bool rc = checkWinPRConfig(sys, FALSE, vendor, product, version,
nullptr);
423 char* sys = winpr_GetConfigFilePath(FALSE,
"usertest");
424 const bool rc = checkWinPRConfig(sys, FALSE, vendor, product, version,
"usertest");
433int TestUtils(WINPR_ATTR_UNUSED
int argc, WINPR_ATTR_UNUSED
char* argv[])
437 if (!checkWinPRResults(
false, WINPR_VENDOR_STRING, WINPR_PRODUCT_STRING, WINPR_VERSION_MAJOR))
442 if (!checkFreeRDPResults(
false, FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING,
443 FREERDP_VERSION_MAJOR))
449 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
451 const test_case_t* cur = &tests[x];
453 if (!freerdp_setApplicationDetails(cur->vendor, cur->product, cur->version))
455 (void)fprintf(stderr,
"freerdp_setApplicationDetails(%s, %s, %" PRIdz
") failed\n",
456 cur->vendor, cur->product, cur->version);
463 const char separator = PathGetSeparatorA(PATH_STYLE_NATIVE);
464#if defined(BUILD_TESTING_INTERNAL)
465 char* wvendor = freerdp_getApplicatonDetailsCombined(separator);
467 char* wvendor = create(cur->vendor, cur->product, cur->version, separator);
474 const BOOL wrc = checkWinPRResults(
true, wvendor,
"WinPR", -1);
481 if (!checkFreeRDPResults(
true, cur->vendor, cur->product, cur->version))
490 printf(
"%s: result %d\n", __func__, rc);