4#include <winpr/crypto.h>
7#include <freerdp/crypto/crypto.h>
8#include <freerdp/settings.h>
9#include <freerdp/codecs.h>
11#include "settings_property_lists.h"
12#include "../settings.h"
14#define log_start() log_start_(__func__)
15static void log_start_(
const char* fkt, ...)
17 (void)fprintf(stderr,
"TestSettings [");
18 va_list ap = WINPR_C_ARRAY_INIT;
20 (void)vfprintf(stderr, fkt, ap);
22 (void)fprintf(stderr,
"] started...\n");
26#define log_result(value) log_result_((value), __func__)
27static BOOL log_result_(BOOL value,
const char* fkt, ...)
29 (void)fprintf(stderr,
"TestSettings [");
30 va_list ap = WINPR_C_ARRAY_INIT;
32 (void)vfprintf(stderr, fkt, ap);
34 (void)fprintf(stderr,
"] returned %s\n", value ?
"TRUE" :
"FALSE");
39static BOOL log_result_case(BOOL value,
const char* fkt,
size_t testcase)
41 (void)fprintf(stderr,
"TestSettings [%s] testcase %" PRIuz
" returned %s\n", fkt, testcase,
42 value ?
"TRUE" :
"FALSE");
56 if (got->argc != expect->argc)
59 for (
int x = 0; x < expect->argc; x++)
61 if (strcmp(got->argv[x], expect->argv[x]) != 0)
64 return log_result(rc);
67static BOOL test_dyn_channels(
void)
74 const char* argv1[] = {
"foobar" };
77 const char* argv2[] = {
"gaga",
"abba",
"foo" };
90 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
93 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
98 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
99 test = freerdp_dynamic_channel_collection_add(settings, args1);
111 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
112 test = freerdp_dynamic_channel_collection_add(settings, args2);
125 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
126 if (!compare(got, cmp1))
128 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
129 if (!compare(got, cmp2))
131 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
140 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
141 if (compare(got, cmp1))
143 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
144 if (!compare(got, cmp2))
146 test = freerdp_dynamic_channel_collection_del(settings,
"gaga");
152 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
153 if (compare(got, cmp1))
155 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
156 if (compare(got, cmp2))
163 freerdp_addin_argv_free(args1);
164 freerdp_addin_argv_free(args2);
165 return log_result(rc);
168static BOOL test_static_channels(
void)
175 const char* argv1[] = {
"foobar" };
178 const char* argv2[] = {
"gaga",
"abba",
"foo" };
191 test = freerdp_static_channel_collection_del(settings,
"foobar");
194 got = freerdp_static_channel_collection_find(settings,
"foobar");
199 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
200 test = freerdp_static_channel_collection_add(settings, args1);
212 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
213 test = freerdp_static_channel_collection_add(settings, args2);
226 got = freerdp_static_channel_collection_find(settings,
"foobar");
227 if (!compare(got, cmp1))
229 got = freerdp_static_channel_collection_find(settings,
"gaga");
230 if (!compare(got, cmp2))
232 test = freerdp_static_channel_collection_del(settings,
"foobar");
241 got = freerdp_static_channel_collection_find(settings,
"foobar");
242 if (compare(got, cmp1))
244 got = freerdp_static_channel_collection_find(settings,
"gaga");
245 if (!compare(got, cmp2))
247 test = freerdp_static_channel_collection_del(settings,
"gaga");
253 got = freerdp_static_channel_collection_find(settings,
"foobar");
254 if (compare(got, cmp1))
256 got = freerdp_static_channel_collection_find(settings,
"gaga");
257 if (compare(got, cmp2))
264 freerdp_addin_argv_free(args1);
265 freerdp_addin_argv_free(args2);
266 return log_result(rc);
269static BOOL test_copy(
void)
273 wLog* log = WLog_Get(__func__);
278 if (!settings || !copy || !modified)
293 return log_result(rc);
296static BOOL test_helpers(
void)
309 if (flags != FREERDP_CODEC_ALL)
315 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_NSCODEC))
321 if (flags != (FREERDP_CODEC_ALL & ~(FREERDP_CODEC_NSCODEC | FREERDP_CODEC_REMOTEFX)))
327 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_REMOTEFX))
333 return log_result(rc);
336static BOOL format_uint(
char* buffer,
size_t size, UINT64 value, UINT16 intType, UINT64 max)
338 const UINT64 lvalue = value > max ? max : value;
339 intType = intType % 3;
343 (void)_snprintf(buffer, size,
"%" PRIu64, lvalue);
346 (void)_snprintf(buffer, size,
"0x%" PRIx64, lvalue);
349 if (max < UINT64_MAX)
350 (void)_snprintf(buffer, size,
"%" PRIu64, max + 1);
352 (
void)_snprintf(buffer, size,
"too large a number");
355 (void)_snprintf(buffer, size,
"not a number value");
360static BOOL print_negative(
char* buffer,
size_t size, INT64 value, INT64 min)
365 (void)_snprintf(buffer, size,
"%" PRId16, (INT16)value);
368 (void)_snprintf(buffer, size,
"%" PRId32, (INT32)value);
371 (void)_snprintf(buffer, size,
"%" PRId64, value);
374 (void)_snprintf(buffer, size,
"too small a number");
379static BOOL print_xpositive(
char* buffer,
size_t size, INT64 value, INT64 max)
383 (void)_snprintf(buffer, size,
"%" PRId64, value);
390 (void)_snprintf(buffer, size,
"%" PRIx16, (INT16)value);
393 (void)_snprintf(buffer, size,
"%" PRIx32, (INT32)value);
396 (void)_snprintf(buffer, size,
"%" PRIx64, value);
399 (void)_snprintf(buffer, size,
"too small a number");
404static BOOL format_int(
char* buffer,
size_t size, INT64 value, UINT16 intType, INT64 max, INT64 min)
406 const INT64 lvalue = (value > max) ? max : ((value < min) ? min : value);
407 intType = intType % 4;
412 (void)_snprintf(buffer, size,
"%" PRId64, lvalue);
415 print_xpositive(buffer, size, lvalue, max);
419 (void)_snprintf(buffer, size,
"%" PRId64, max + 1);
421 (
void)_snprintf(buffer, size,
"too large a number");
425 print_negative(buffer, size, min - 1, INT64_MIN);
427 (
void)_snprintf(buffer, size,
"too small a number");
430 (void)_snprintf(buffer, size,
"not a number value");
435static BOOL format_bool(
char* buffer,
size_t size, UINT16 intType)
437 intType = intType % 10;
441 (void)_snprintf(buffer, size,
"FALSE");
444 (void)_snprintf(buffer, size,
"FaLsE");
447 (void)_snprintf(buffer, size,
"False");
450 (void)_snprintf(buffer, size,
"false");
453 (void)_snprintf(buffer, size,
"falseentry");
456 (void)_snprintf(buffer, size,
"TRUE");
459 (void)_snprintf(buffer, size,
"TrUe");
462 (void)_snprintf(buffer, size,
"True");
465 (void)_snprintf(buffer, size,
"true");
468 (void)_snprintf(buffer, size,
"someentry");
471 (void)_snprintf(buffer, size,
"ok");
476static BOOL check_key_helpers(
size_t key,
const char* stype)
479 int test_rounds = 100;
481 rdpSettings* settings =
nullptr;
485 const size_t clear_keys[] = { FreeRDP_RdpServerCertificate,
486 FreeRDP_RdpServerRsaKey,
487 FreeRDP_RedirectionPassword,
488 FreeRDP_RedirectionTsvUrl,
489 FreeRDP_LoadBalanceInfo,
490 FreeRDP_ServerRandom,
491 FreeRDP_ClientRandom,
492 FreeRDP_ServerCertificate,
493 FreeRDP_TargetNetAddresses,
494 FreeRDP_ReceivedCapabilities,
495 FreeRDP_ServerLicenseProductIssuers,
496 FreeRDP_TargetNetPorts,
498 FreeRDP_ChannelDefArray,
499 FreeRDP_MonitorDefArray,
500 FreeRDP_ClientAutoReconnectCookie,
501 FreeRDP_ServerAutoReconnectCookie,
502 FreeRDP_ClientTimeZone,
503 FreeRDP_BitmapCacheV2CellInfo,
506 FreeRDP_StaticChannelArray,
507 FreeRDP_DynamicChannelArray,
508 FreeRDP_ReceivedCapabilities,
509 FreeRDP_OrderSupport,
510 FreeRDP_MonitorIds };
514 printf(
"[%s] missing name for key %" PRIuz
"\n", stype, key);
520 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
523 if ((
size_t)tkey != key)
525 printf(
"[%s] mismatch reverse name for key %s [%" PRIuz
"]: %" PRIdz
"\n", stype, name, key,
532 printf(
"[%s] missing reverse type for key %s [%" PRIuz
"]\n", stype, name, key);
538 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
544 printf(
"[%s] mismatch reverse type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
545 stype, name, key, rc, type);
552 printf(
"[%s] freerdp_settings_new failed\n", stype);
555 for (
size_t x = 0; x < ARRAYSIZE(clear_keys); x++)
557 const size_t id = clear_keys[x];
561 printf(
"[%s] freerdp_settings_set_pointer_len(%s, nullptr, 0) failed\n", stype, foo);
567 UINT16 intEntryType = 0;
570 char value[8192] = WINPR_C_ARRAY_INIT;
582 if (winpr_RAND(&intEntryType,
sizeof(intEntryType)) < 0)
584 if (winpr_RAND(&val.u64,
sizeof(val.u64)) < 0)
589 case FreeRDP_ReceivedCapabilitiesSize:
590 case FreeRDP_TargetNetAddressCount:
599 case RDP_SETTINGS_TYPE_BOOL:
600 expect = format_bool(value,
sizeof(value), intEntryType);
602 case RDP_SETTINGS_TYPE_UINT16:
603 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT16_MAX);
605 case RDP_SETTINGS_TYPE_INT16:
607 format_int(value,
sizeof(value), val.i64, intEntryType, INT16_MAX, INT16_MIN);
609 case RDP_SETTINGS_TYPE_UINT32:
610 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT32_MAX);
612 case RDP_SETTINGS_TYPE_INT32:
614 format_int(value,
sizeof(value), val.i64, intEntryType, INT32_MAX, INT32_MIN);
616 case RDP_SETTINGS_TYPE_UINT64:
617 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT64_MAX);
619 case RDP_SETTINGS_TYPE_INT64:
621 format_int(value,
sizeof(value), val.i64, intEntryType, INT64_MAX, INT64_MIN);
623 case RDP_SETTINGS_TYPE_STRING:
625 (void)_snprintf(value,
sizeof(value),
"somerandomstring");
627 case RDP_SETTINGS_TYPE_POINTER:
632 printf(
"[%s] invalid type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
633 stype, name, key, rc, type);
637 have = freerdp_settings_set_value_for_name(settings, name, value);
640 printf(
"[%s] %s=%s have [%s] != expect[%s]\n", stype, name, value,
641 have ?
"TRUE" :
"FALSE", expect ?
"TRUE" :
"FALSE");
645 }
while (test_rounds-- > 0);
650 return log_result(res);
653static BOOL check_args(
const RDPDR_DEVICE* what,
size_t count,
const char* args[])
659 if (strcmp(what->Name, args[0]) != 0)
665 case RDPDR_DTYP_PRINT:
672 return strcmp(a->DriverName, args[1]) == 0;
675 case RDPDR_DTYP_SERIAL:
683 if (strcmp(a->Path, args[1]) != 0)
691 if (strcmp(a->Driver, args[2]) != 0)
699 if (strcmp(a->Permissive, args[3]) != 0)
705 case RDPDR_DTYP_PARALLEL:
712 return strcmp(a->Path, args[1]) == 0;
715 case RDPDR_DTYP_SMARTCARD:
718 case RDPDR_DTYP_FILESYSTEM:
725 if (strcmp(a->Path, args[1]) != 0)
730 return (a->automount == (args[2] ==
nullptr));
733 return !a->automount;
741static int check_device_type_arg(UINT32 Type,
size_t count,
const char* args[])
744 RDPDR_DEVICE* device = freerdp_device_new(Type, count, args);
755 if (!check_args(device, count, args))
759 if (!freerdp_device_equal(clone, device))
764 freerdp_device_free(device);
765 freerdp_device_free(clone);
766 return log_result(rc);
769static BOOL check_device_type(
void)
779 const char* args[] = {
"somename",
"anothername",
"3rdname",
"4thname" };
780 const struct test_entry tests[] = {
781 { 1, RDPDR_DTYP_SERIAL, 0,
nullptr },
782 { 1, RDPDR_DTYP_SERIAL, 0, args },
783 { 1, RDPDR_DTYP_SERIAL, 1, args },
784 { 1, RDPDR_DTYP_SERIAL, 2, args },
785 { 1, RDPDR_DTYP_SERIAL, 3, args },
786 { 1, RDPDR_DTYP_SERIAL, 4, args },
787 { 1, RDPDR_DTYP_PARALLEL, 0,
nullptr },
788 { 1, RDPDR_DTYP_PARALLEL, 0, args },
789 { 1, RDPDR_DTYP_PARALLEL, 1, args },
790 { 1, RDPDR_DTYP_PARALLEL, 2, args },
791 { 1, RDPDR_DTYP_PARALLEL, 3, args },
792 { 1, RDPDR_DTYP_PARALLEL, 4, args },
793 { 1, RDPDR_DTYP_PRINT, 0,
nullptr },
794 { 1, RDPDR_DTYP_PRINT, 0, args },
795 { 1, RDPDR_DTYP_PRINT, 1, args },
796 { 1, RDPDR_DTYP_PRINT, 2, args },
797 { 1, RDPDR_DTYP_PRINT, 3, args },
798 { 1, RDPDR_DTYP_PRINT, 4, args },
799 { 1, RDPDR_DTYP_FILESYSTEM, 0,
nullptr },
800 { 1, RDPDR_DTYP_FILESYSTEM, 0, args },
801 { 1, RDPDR_DTYP_FILESYSTEM, 1, args },
802 { 1, RDPDR_DTYP_FILESYSTEM, 2, args },
803 { 1, RDPDR_DTYP_FILESYSTEM, 3, args },
804 { 1, RDPDR_DTYP_FILESYSTEM, 4, args },
805 { 1, RDPDR_DTYP_SMARTCARD, 0,
nullptr },
806 { 1, RDPDR_DTYP_SMARTCARD, 0, args },
807 { 1, RDPDR_DTYP_SMARTCARD, 1, args },
808 { 1, RDPDR_DTYP_SMARTCARD, 2, args },
809 { 1, RDPDR_DTYP_SMARTCARD, 3, args },
810 { 1, RDPDR_DTYP_SMARTCARD, 4, args },
811 { -3, 0x123, 0,
nullptr },
812 { -3, 0x123, 0, args },
813 { -3, 0x123, 1, args },
814 { -3, 0x123, 2, args },
815 { -3, 0x123, 3, args },
816 { -3, 0x123, 4, args },
819 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
821 const struct test_entry* cur = &tests[x];
822 int got = check_device_type_arg(cur->type, cur->count, cur->args);
823 if (got != cur->expect)
826 return log_result(rc);
829static BOOL check_offsets(rdpSettings* settings,
size_t id,
size_t min,
size_t max, BOOL checkPtr)
833 WINPR_ASSERT(settings);
838 for (
size_t x = min; x < max; x++)
840 const void* ptr = freerdp_settings_get_pointer_array(settings,
id, x);
841 if (!ptr && checkPtr)
844 return log_result(rc);
847static BOOL test_write_offsets(rdpSettings* settings,
size_t id,
size_t elementSize,
size_t min,
850 WINPR_ASSERT(settings);
852 for (
size_t x = min; x < max; x++)
854 const void* ptr =
nullptr;
855 char buffer[8192] = WINPR_C_ARRAY_INIT;
857 if (winpr_RAND(buffer,
sizeof(buffer)) < 0)
859 if (!freerdp_settings_set_pointer_array(settings,
id, x, buffer))
861 ptr = freerdp_settings_get_pointer_array(settings,
id, x);
864 if (memcmp(ptr, buffer, elementSize) != 0)
870static BOOL test_pointer_array(
void)
872 struct pointer_test_case
881 const struct pointer_test_case tests[] = {
882 { FALSE, FALSE, FreeRDP_DeviceArray, FreeRDP_DeviceArraySize, 32,
sizeof(
RDPDR_DEVICE*) },
883 { FALSE, FALSE, FreeRDP_StaticChannelArray, FreeRDP_StaticChannelArraySize, 32,
885 { FALSE, FALSE, FreeRDP_DynamicChannelArray, FreeRDP_DynamicChannelArraySize, 33,
887 { TRUE, TRUE, FreeRDP_BitmapCacheV2CellInfo, FreeRDP_BitmapCacheV2NumCells, 5,
889 { FALSE, FALSE, FreeRDP_OrderSupport, -1, 32,
sizeof(BYTE) },
890 { FALSE, FALSE, FreeRDP_ReceivedCapabilities, -1, 32,
sizeof(BYTE) },
893 { TRUE, TRUE, FreeRDP_MonitorIds, FreeRDP_NumMonitorIds, 33,
sizeof(UINT32) },
894 { TRUE, TRUE, FreeRDP_ChannelDefArray, FreeRDP_ChannelDefArraySize, 42,
896 { TRUE, TRUE, FreeRDP_MonitorDefArray, FreeRDP_MonitorDefArraySize, 33,
899 { FALSE, FALSE, FreeRDP_RdpServerCertificate, -1, 1,
sizeof(rdpCertificate*) },
901 { TRUE, TRUE, FreeRDP_RedirectionPassword, FreeRDP_RedirectionPasswordLength, 42,
903 { TRUE, TRUE, FreeRDP_RedirectionTsvUrl, FreeRDP_RedirectionTsvUrlLength, 42,
905 { TRUE, TRUE, FreeRDP_LoadBalanceInfo, FreeRDP_LoadBalanceInfoLength, 42,
sizeof(char) },
906 { TRUE, TRUE, FreeRDP_ServerRandom, FreeRDP_ServerRandomLength, 42,
sizeof(char) },
907 { TRUE, TRUE, FreeRDP_ClientRandom, FreeRDP_ClientRandomLength, 42,
sizeof(char) },
908 { TRUE, TRUE, FreeRDP_ServerCertificate, FreeRDP_ServerCertificateLength, 42,
918 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
920 const struct pointer_test_case* cur = &tests[x];
923 if (cur->sizeId >= 0)
929 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
931 if (check_offsets(settings, cur->id, cur->size, cur->size + 5, TRUE))
935 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
937 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
942 if (cur->sizeId >= 0)
948 if (check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
952 if (test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
957 if (cur->sizeId >= 0)
963 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
965 if (check_offsets(settings, cur->id, cur->size + 1, cur->size + 5, TRUE))
969 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
971 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
980 return log_result(rc);
983struct validity_test_case
990static BOOL prepare_monitor_array(rdpSettings* settings,
const struct validity_test_case* testcase)
992 WINPR_ASSERT(settings);
993 WINPR_ASSERT(testcase);
999static BOOL check_primary_offset(
const rdpSettings* settings,
const rdpMonitor* monitors,
1003 for (
size_t x = 0; x < count; x++)
1006 if (cur->is_primary)
1011 for (
size_t x = 0; x < count; x++)
1014 if ((cur->x == 0) && (cur->y == 0))
1019 for (
size_t x = 0; x < count; x++)
1022 freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorDefArray, x);
1025 if (cur->is_primary)
1029 if (!sprimary || !cprimary)
1032 const INT32 xoff = cprimary->x;
1033 const INT32 yoff = cprimary->y;
1043static BOOL test_validity_check(
void)
1058 .attributes = { .physicalWidth = 100,
1059 .physicalHeight = 100,
1060 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1061 .desktopScaleFactor = 100,
1062 .deviceScaleFactor = 100 } }
1064 const rdpMonitor single_monitor_invalid_1[] = {
1071 .attributes = { .physicalWidth = 100,
1072 .physicalHeight = 100,
1073 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1074 .desktopScaleFactor = 100,
1075 .deviceScaleFactor = 100 } }
1077 const rdpMonitor single_monitor_invalid_2[] = {
1084 .attributes = { .physicalWidth = 100,
1085 .physicalHeight = 100,
1086 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1087 .desktopScaleFactor = 100,
1088 .deviceScaleFactor = 100 } }
1090 const rdpMonitor single_monitor_invalid_3[] = {
1097 .attributes = { .physicalWidth = 100,
1098 .physicalHeight = 100,
1099 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1100 .desktopScaleFactor = 100,
1101 .deviceScaleFactor = 100 } }
1103 const rdpMonitor single_monitor_invalid_4[] = {
1110 .attributes = { .physicalWidth = 100,
1111 .physicalHeight = 100,
1112 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1113 .desktopScaleFactor = 100,
1114 .deviceScaleFactor = 100 } }
1121 .is_primary = FALSE,
1123 .attributes = { .physicalWidth = 100,
1124 .physicalHeight = 100,
1125 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1126 .desktopScaleFactor = 100,
1127 .deviceScaleFactor = 100 } },
1132 .is_primary = FALSE,
1134 .attributes = { .physicalWidth = 100,
1135 .physicalHeight = 100,
1136 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1137 .desktopScaleFactor = 100,
1138 .deviceScaleFactor = 100 } },
1143 .is_primary = FALSE,
1145 .attributes = { .physicalWidth = 100,
1146 .physicalHeight = 100,
1147 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1148 .desktopScaleFactor = 100,
1149 .deviceScaleFactor = 100 } },
1154 .is_primary = FALSE,
1156 .attributes = { .physicalWidth = 100,
1157 .physicalHeight = 100,
1158 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1159 .desktopScaleFactor = 100,
1160 .deviceScaleFactor = 100 } },
1167 .attributes = { .physicalWidth = 100,
1168 .physicalHeight = 100,
1169 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1170 .desktopScaleFactor = 100,
1171 .deviceScaleFactor = 100 } },
1176 .is_primary = FALSE,
1178 .attributes = { .physicalWidth = 100,
1179 .physicalHeight = 100,
1180 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1181 .desktopScaleFactor = 100,
1182 .deviceScaleFactor = 100 } },
1187 .is_primary = FALSE,
1189 .attributes = { .physicalWidth = 100,
1190 .physicalHeight = 100,
1191 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1192 .desktopScaleFactor = 100,
1193 .deviceScaleFactor = 100 } },
1198 .is_primary = FALSE,
1200 .attributes = { .physicalWidth = 100,
1201 .physicalHeight = 100,
1202 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1203 .desktopScaleFactor = 100,
1204 .deviceScaleFactor = 100 } },
1209 .is_primary = FALSE,
1211 .attributes = { .physicalWidth = 100,
1212 .physicalHeight = 100,
1213 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1214 .desktopScaleFactor = 100,
1215 .deviceScaleFactor = 100 } },
1220 .is_primary = FALSE,
1222 .attributes = { .physicalWidth = 100,
1223 .physicalHeight = 100,
1224 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1225 .desktopScaleFactor = 100,
1226 .deviceScaleFactor = 100 } },
1231 .is_primary = FALSE,
1233 .attributes = { .physicalWidth = 100,
1234 .physicalHeight = 100,
1235 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1236 .desktopScaleFactor = 100,
1237 .deviceScaleFactor = 100 } },
1242 .is_primary = FALSE,
1244 .attributes = { .physicalWidth = 100,
1245 .physicalHeight = 100,
1246 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1247 .desktopScaleFactor = 100,
1248 .deviceScaleFactor = 100 } },
1250 const rdpMonitor multi_monitor_invalid_1[] = {
1255 .is_primary = FALSE,
1257 .attributes = { .physicalWidth = 100,
1258 .physicalHeight = 100,
1259 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1260 .desktopScaleFactor = 100,
1261 .deviceScaleFactor = 100 } },
1266 .is_primary = FALSE,
1268 .attributes = { .physicalWidth = 100,
1269 .physicalHeight = 100,
1270 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1271 .desktopScaleFactor = 100,
1272 .deviceScaleFactor = 100 } }
1274 const rdpMonitor multi_monitor_invalid_2[] = {
1279 .is_primary = FALSE,
1281 .attributes = { .physicalWidth = 100,
1282 .physicalHeight = 100,
1283 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1284 .desktopScaleFactor = 100,
1285 .deviceScaleFactor = 100 } },
1292 .attributes = { .physicalWidth = 100,
1293 .physicalHeight = 100,
1294 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1295 .desktopScaleFactor = 100,
1296 .deviceScaleFactor = 100 } }
1298 const rdpMonitor multi_monitor_invalid_3[] = {
1303 .is_primary = FALSE,
1305 .attributes = { .physicalWidth = 100,
1306 .physicalHeight = 100,
1307 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1308 .desktopScaleFactor = 100,
1309 .deviceScaleFactor = 100 } },
1316 .attributes = { .physicalWidth = 100,
1317 .physicalHeight = 100,
1318 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1319 .desktopScaleFactor = 100,
1320 .deviceScaleFactor = 100 } }
1322 const rdpMonitor multi_monitor_invalid_4[] = {
1327 .is_primary = FALSE,
1329 .attributes = { .physicalWidth = 100,
1330 .physicalHeight = 100,
1331 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1332 .desktopScaleFactor = 100,
1333 .deviceScaleFactor = 100 } },
1340 .attributes = { .physicalWidth = 100,
1341 .physicalHeight = 100,
1342 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1343 .desktopScaleFactor = 100,
1344 .deviceScaleFactor = 100 } }
1354 .attributes = { .physicalWidth = 100,
1355 .physicalHeight = 100,
1356 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1357 .desktopScaleFactor = 100,
1358 .deviceScaleFactor = 100 } },
1363 .is_primary = FALSE,
1365 .attributes = { .physicalWidth = 100,
1366 .physicalHeight = 100,
1367 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1368 .desktopScaleFactor = 100,
1369 .deviceScaleFactor = 100 } },
1374 .is_primary = FALSE,
1376 .attributes = { .physicalWidth = 100,
1377 .physicalHeight = 100,
1378 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1379 .desktopScaleFactor = 100,
1380 .deviceScaleFactor = 100 } }
1390 .attributes = { .physicalWidth = 100,
1391 .physicalHeight = 100,
1392 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1393 .desktopScaleFactor = 100,
1394 .deviceScaleFactor = 100 } },
1399 .is_primary = FALSE,
1401 .attributes = { .physicalWidth = 100,
1402 .physicalHeight = 100,
1403 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1404 .desktopScaleFactor = 100,
1405 .deviceScaleFactor = 100 } },
1410 .is_primary = FALSE,
1412 .attributes = { .physicalWidth = 100,
1413 .physicalHeight = 100,
1414 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1415 .desktopScaleFactor = 100,
1416 .deviceScaleFactor = 100 } }
1419 const struct validity_test_case tests[] = {
1420 { TRUE, ARRAYSIZE(single_monitor_valid), single_monitor_valid },
1421 { FALSE, ARRAYSIZE(single_monitor_invalid_1), single_monitor_invalid_1 },
1422 { FALSE, ARRAYSIZE(single_monitor_invalid_2), single_monitor_invalid_2 },
1423 { FALSE, ARRAYSIZE(single_monitor_invalid_3), single_monitor_invalid_3 },
1424 { FALSE, ARRAYSIZE(single_monitor_invalid_4), single_monitor_invalid_4 },
1425 { TRUE, ARRAYSIZE(multi_monitor_valid), multi_monitor_valid },
1426 { TRUE, ARRAYSIZE(multi_monitor_invalid_1), multi_monitor_invalid_1 },
1427 { FALSE, ARRAYSIZE(multi_monitor_invalid_2), multi_monitor_invalid_2 },
1428 { FALSE, ARRAYSIZE(multi_monitor_invalid_3), multi_monitor_invalid_3 },
1429 { FALSE, ARRAYSIZE(multi_monitor_invalid_4), multi_monitor_invalid_4 },
1430 { TRUE, ARRAYSIZE(multi_monitor_valid_2), multi_monitor_valid_2 },
1431 { TRUE, ARRAYSIZE(multi_monitor_valid_3), multi_monitor_valid_3 }
1435 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
1437 const struct validity_test_case* cur = &tests[x];
1439 if (!prepare_monitor_array(settings, cur))
1440 rc = log_result_case(FALSE, __func__, x);
1443#if defined(BUILD_TESTING_INTERNAL)
1444 const BOOL res = freerdp_settings_check_client_after_preconnect(settings);
1446 const BOOL res = cur->expected;
1449 if ((res != cur->expected) ||
1450 !check_primary_offset(settings, cur->monitors, cur->count))
1452 rc = log_result_case(FALSE, __func__, x);
1459 return log_result(rc);
1462static BOOL test_string_null(rdpSettings* settings, FreeRDP_Settings_Keys_String
id)
1468 return (chk ==
nullptr);
1471static BOOL test_string_check(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1472 const char*
string,
size_t len)
1478 const size_t clen = strnlen(chk, len + 1);
1485 if (strncmp(
string, chk, clen) != 0)
1491static BOOL test_string_check_reset(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1492 const char*
string,
size_t len)
1494 return test_string_check(settings,
id,
string, len) && test_string_null(settings,
id);
1497static BOOL test_string_set_readback(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1498 const char*
string,
size_t len)
1500 WINPR_ASSERT(len > 3);
1503 WCHAR* wstr =
nullptr;
1505 const size_t slen = strnlen(
string, len);
1509 if (!test_string_check_reset(settings,
id,
string, slen - 1))
1517 if (!wstr || (wlen != slen))
1520 if (!test_string_check_reset(settings,
id,
string, slen))
1526 if (!test_string_check(settings,
id,
string, slen - 1))
1532 if (!test_string_check(settings,
id,
string, slen))
1541static BOOL test_string_len(rdpSettings* settings)
1545 const char user[] =
"abcdefg";
1546 if (!test_string_set_readback(settings, FreeRDP_Username, user,
sizeof(user)))
1549 const char pwd[] =
"xyz";
1550 if (!test_string_set_readback(settings, FreeRDP_Password, pwd,
sizeof(pwd)))
1553 const char domain[] =
"foobar";
1554 if (!test_string_set_readback(settings, FreeRDP_Domain, domain,
sizeof(domain)))
1562static BOOL test_serialize_with(rdpSettings* src,
const char* name)
1567 rdpSettings* dst =
nullptr;
1568 char* str =
nullptr;
1572 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_serialize");
1574 if (!str || (slen == 0))
1577 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_deserialize");
1582 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_print_diff");
1590 return log_result_(rc,
"%s-%s", name, __func__);
1593static BOOL test_serialize_strings(DWORD flags,
const char* str)
1600 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
1605 FreeRDP_Settings_Keys_Pointer ptr;
1612 case RDP_SETTINGS_TYPE_STRING:
1624 char buffer[128] = WINPR_C_ARRAY_INIT;
1625 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32
" {%s}", __func__, flags, str);
1626 return test_serialize_with(src, buffer);
1629static BOOL add_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1631 ADDIN_ARGV* val = freerdp_addin_argv_new(argc, argv);
1634 if (!freerdp_static_channel_collection_add(src, val))
1636 if (!freerdp_static_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1638 if (!freerdp_dynamic_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1644static BOOL add_dev_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1646 FreeRDP_Settings_Keys_Pointer key = FreeRDP_DeviceArray;
1651 const uint32_t types[] = { RDPDR_DTYP_SERIAL, RDPDR_DTYP_PARALLEL, RDPDR_DTYP_PRINT,
1652 RDPDR_DTYP_FILESYSTEM, RDPDR_DTYP_SMARTCARD };
1654 for (
size_t x = 0; x < count; x++)
1656 const uint32_t type = types[x % ARRAYSIZE(types)];
1657 RDPDR_DEVICE* arg = freerdp_device_new(type, argc, argv);
1660 const BOOL rc = freerdp_settings_set_pointer_array(src, key, x, arg);
1661 freerdp_device_free(arg);
1668static BOOL fill_random(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key,
size_t elem,
1677 const size_t size = len * elem;
1678 char* random = calloc(len, elem);
1681 char* b64 = crypto_base64_encode(random, size);
1683 memcpy(data, b64, size);
1688static BOOL fill_random_timezone(rdpSettings* src)
1690 FreeRDP_Settings_Keys_Pointer key = FreeRDP_ClientTimeZone;
1697 (void)ConvertUtf8ToWChar(
"testXXXXDaylight", data->DaylightName, ARRAYSIZE(data->DaylightName));
1698 (void)ConvertUtf8ToWChar(
"testXXXX", data->StandardName, ARRAYSIZE(data->StandardName));
1703static BOOL set_private_key(rdpSettings* src)
1708 rdpPrivateKey* key =
1709 freerdp_settings_get_pointer_array_writable(src, FreeRDP_RdpServerRsaKey, 0);
1713 return freerdp_key_generate(key,
"RSA", 1, 4096);
1716static BOOL set_cert(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key)
1718 const char pem[] =
"-----BEGIN CERTIFICATE-----\n"
1719 "MIICvTCCAaWgAwIBAgIEZrM9yjANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAlt\n"
1720 "b3RvcmhlYWQwHhcNMjUwNDE1MTExMjE5WhcNMjYwNDE1MTExMjE5WjAUMRIwEAYD\n"
1721 "VQQDDAltb3RvcmhlYWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw\n"
1722 "g0tADY3kh5Hi6YsTsQbuaPs50zlTpIv+rCCK3BNIblsIh4cSO1YGdWfB0gP9bUD1\n"
1723 "L7mPWRnIiAvwrRA/Mgyo+UgiYj/aE3xxN3adB9/QsUzNrI07o6L8MupV4237txMj\n"
1724 "uxVmarB4c7E4wFgSxwbMQPhQtoNNew3bY+EeqhQBMFfYy4z+rg60xl0QHGcMePY/\n"
1725 "xz0WMHrIz6FhZfBIr+BGViRtjIchbjcU0HfTSujX+MT0D5MBISe8aiFvrewFItfT\n"
1726 "vglriDLeNMiB9U/aRLV8OtW+heGNhi5qSC9JXEW70OFeGAoqtwyRHLnSh38Fo2xv\n"
1727 "fEc90zjkCan8usEDKuzBAgMBAAGjFzAVMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0G\n"
1728 "CSqGSIb3DQEBCwUAA4IBAQBY1wkJ6XWduNmTi+UNdcZ5e9GWV/3+SYLtFALwKVrU\n"
1729 "KQQbsYnGLfyUKXFc7e9JoZ+UCTJgY3EyL+6p79io+cFeTtpp1RVKljibbeRAP01W\n"
1730 "WbcxcHZFKgBlH1KNSeO7iOAPet3aCaVDKl1XSU7fhxtsfBBI9YTtaMZM5e9WhuHK\n"
1731 "lL11Un6ePThX+4NG1yYp0X+emqUHd/qaq8IShnU6ajvzoloWGf4vLlDSsuFHJJsK\n"
1732 "LnshNFOFGAjp1Se4DjhtUSr6Xofdse+kx9cSQazCZ5vFJNeHkxr0B7ojQ4bN37Tg\n"
1733 "2uyfSclCCLnmjcoRMlIGUiL2bevCPDRNRWiblDgx3tGG\n"
1734 "-----END CERTIFICATE-----\n";
1736 rdpCertificate* cert = freerdp_certificate_new_from_pem(pem);
1742static BOOL set_string_array(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key, uint32_t max)
1745 if (winpr_RAND(&count,
sizeof(count)) < 0)
1747 count = count % max;
1752 for (uint32_t x = 0; x < count; x++)
1754 char buffer[32] = WINPR_C_ARRAY_INIT;
1755 (void)_snprintf(buffer,
sizeof(buffer),
"foobar-0x%08" PRIu32, x);
1756 if (!freerdp_settings_set_pointer_array(src, key, x, buffer))
1762static BOOL test_serialize_pointer(DWORD flags)
1769 const char* argv1[] = {
"foobar",
"lala",
"haha" };
1770 const char* argv2[] = {
"lala",
"haha" };
1771 const char* argv3[] = {
"haha" };
1772 if (!add_argv(src, ARRAYSIZE(argv1), argv1))
1774 if (!add_argv(src, ARRAYSIZE(argv2), argv2))
1776 if (!add_argv(src, ARRAYSIZE(argv3), argv3))
1778 if (!add_dev_argv(src, ARRAYSIZE(argv3), argv3))
1783 FreeRDP_Settings_Keys_Pointer key;
1788 const struct key_len_pair keys[] = {
1789 { FreeRDP_ServerRandom, 1, 123 },
1790 { FreeRDP_RedirectionPassword, 1, 13 },
1791 { FreeRDP_ClientRandom, 1, 23 },
1792 { FreeRDP_RedirectionGuid, 1, 22 },
1793 { FreeRDP_LoadBalanceInfo, 1, 21 },
1794 { FreeRDP_ServerCertificate, 1, 512 },
1795 { FreeRDP_RedirectionTsvUrl, 1, 33 },
1799 { FreeRDP_OrderSupport, 1, 32 },
1802 { FreeRDP_Password51, 1, 54 },
1803 { FreeRDP_MonitorIds, 1, 111 },
1804 { FreeRDP_MonitorDefArray, 1, 7 },
1805 { FreeRDP_ChannelDefArray, 1, 31 },
1806 { FreeRDP_ReceivedCapabilities,
sizeof(uint8_t), 33 },
1807 { FreeRDP_ReceivedCapabilityData,
sizeof(uint8_t*), 33 },
1808 { FreeRDP_ReceivedCapabilityDataSizes,
sizeof(UINT32), 33 }
1811 for (
size_t x = 0; x < ARRAYSIZE(keys); x++)
1813 const struct key_len_pair* cur = &keys[x];
1814 if (!fill_random(src, cur->key, cur->elem, cur->len))
1818 if (!fill_random_timezone(src))
1821 void* ptr =
nullptr;
1822 if (winpr_RAND((
void*)&ptr,
sizeof(
void*)) < 0)
1827 if (!set_private_key(src))
1829 if (!set_cert(src, FreeRDP_RedirectionTargetCertificate))
1831 if (!set_cert(src, FreeRDP_RdpServerCertificate))
1834 if (!set_string_array(src, FreeRDP_ServerLicenseProductIssuers, 43))
1837 char addresses[12][43] = WINPR_C_ARRAY_INIT;
1838 char* strptr[12] = WINPR_C_ARRAY_INIT;
1840 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1842 (void)_snprintf(addresses[x], 43,
"foobar-0x%08" PRIx32, x);
1843 strptr[x] = addresses[x];
1846 if (!freerdp_target_net_addresses_copy(src, strptr, ARRAYSIZE(addresses)))
1849 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1852 if (winpr_RAND(&port,
sizeof(port)) < 0)
1854 if (!freerdp_settings_set_pointer_array(src, FreeRDP_TargetNetPorts, x, &port))
1865 if (winpr_RAND(caps, count) < 0)
1868 for (uint32_t x = 0; x < count; x++)
1870 uint8_t* buffer = calloc(64,
sizeof(uint8_t));
1873 if (winpr_RAND(buffer,
sizeof(buffer)) < 0)
1875 uint32_t blen = (buffer[0] % 52) + 13;
1877 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityData, x, buffer))
1879 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityDataSizes, x, &blen))
1883 char buffer[128] = WINPR_C_ARRAY_INIT;
1884 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32, __func__, flags);
1885 return test_serialize_with(src, buffer);
1892static BOOL test_serialize(
void)
1902 for (uint32_t flags = 0;
1905 char buffer[32] = WINPR_C_ARRAY_INIT;
1906 (void)_snprintf(buffer,
sizeof(buffer),
"default (flags 0x%08" PRIx32
")", flags);
1909 if (!test_serialize_strings(flags,
"foobar"))
1911 if (!test_serialize_strings(flags,
""))
1913 if (!test_serialize_strings(flags,
nullptr))
1915 if (!test_serialize_pointer(flags))
1925static BOOL test_bool_list(rdpSettings* settings,
const rdpSettings* cloned)
1930 WINPR_ASSERT(settings);
1931 WINPR_ASSERT(cloned);
1933#if defined(have_bool_list_indices)
1935 for (
size_t x = 0; x < ARRAYSIZE(bool_list_indices); x++)
1937 const size_t key = bool_list_indices[x];
1944 printf(
"mismatch for key %s: %u -> copy %u\n", name, val, cval);
1949 if (!check_key_helpers(key,
"bool"))
1956 return log_result(rc);
1959static BOOL test_int16_list(
const rdpSettings* settings,
const rdpSettings* cloned)
1964 WINPR_ASSERT(settings);
1965 WINPR_ASSERT(cloned);
1967#if defined(have_int16_list_indices)
1969 for (
size_t x = 0; x < ARRAYSIZE(int16_list_indices); x++)
1971 const size_t key = int16_list_indices[x];
1977 printf(
"mismatch for key %s: %" PRId16
" -> copy %" PRId16
"\n", name, val, cval);
1982 if (!check_key_helpers(key,
"int16"))
1989 return log_result(rc);
1992static BOOL test_uint16_list(rdpSettings* settings,
const rdpSettings* cloned)
1997 WINPR_ASSERT(settings);
1998 WINPR_ASSERT(cloned);
2000#if defined(have_uint16_list_indices)
2002 for (
size_t x = 0; x < ARRAYSIZE(uint16_list_indices); x++)
2004 const size_t key = uint16_list_indices[x];
2011 printf(
"mismatch for key %s: %" PRIu16
" -> copy %" PRIu16
"\n", name, val, cval);
2016 if (!check_key_helpers(key,
"uint16"))
2023 return log_result(rc);
2026static BOOL test_int32_list(rdpSettings* settings,
const rdpSettings* cloned)
2031 WINPR_ASSERT(settings);
2032 WINPR_ASSERT(cloned);
2034#if defined(have_int32_list_indices)
2036 for (
size_t x = 0; x < ARRAYSIZE(int32_list_indices); x++)
2038 const size_t key = int32_list_indices[x];
2045 printf(
"mismatch for key %s: %" PRId32
" -> copy %" PRId32
"\n", name, val, cval);
2050 if (!check_key_helpers(key,
"int32"))
2058 return log_result(rc);
2061static BOOL test_uint32_list(rdpSettings* settings,
const rdpSettings* cloned)
2066 WINPR_ASSERT(settings);
2067 WINPR_ASSERT(cloned);
2069#if defined(have_uint32_list_indices)
2071 for (
size_t x = 0; x < ARRAYSIZE(uint32_list_indices); x++)
2073 const size_t key = uint32_list_indices[x];
2080 printf(
"mismatch for key %s: %" PRIu32
" -> copy %" PRIu32
"\n", name, val, cval);
2085 if (!check_key_helpers(key,
"uint32"))
2093 return log_result(rc);
2096static BOOL test_int64_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2101 WINPR_ASSERT(settings);
2102 WINPR_ASSERT(cloned);
2104#if defined(have_int64_list_indices)
2106 for (
size_t x = 0; x < ARRAYSIZE(int64_list_indices); x++)
2108 const size_t key = int64_list_indices[x];
2114 printf(
"mismatch for key %s: %" PRId64
" -> copy %" PRId64
"\n", name, val, cval);
2119 if (!check_key_helpers(key,
"int64"))
2127 return log_result(rc);
2130static BOOL test_uint64_list(rdpSettings* settings,
const rdpSettings* cloned)
2135 WINPR_ASSERT(settings);
2136 WINPR_ASSERT(cloned);
2138#if defined(have_uint64_list_indices)
2140 for (
size_t x = 0; x < ARRAYSIZE(uint64_list_indices); x++)
2142 const size_t key = uint64_list_indices[x];
2149 printf(
"mismatch for key %s: %" PRIu64
" -> copy %" PRIu64
"\n", name, val, cval);
2154 if (!check_key_helpers(key,
"uint64"))
2162 return log_result(rc);
2165static BOOL test_string_list(rdpSettings* settings,
const rdpSettings* cloned)
2170 WINPR_ASSERT(settings);
2171 WINPR_ASSERT(cloned);
2173#if defined(have_string_list_indices)
2175 for (
size_t x = 0; x < ARRAYSIZE(string_list_indices); x++)
2177 const size_t key = string_list_indices[x];
2178 const char val[] =
"test-string";
2179 const char* res =
nullptr;
2184 if ((oval != cval) && (strcmp(oval, cval) != 0))
2186 printf(
"mismatch for key %s: %s -> copy %s\n", name, oval, cval);
2194 if (strncmp(val, res,
sizeof(val)) != 0)
2202 return log_result(rc);
2205static BOOL test_pointer_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2210 WINPR_ASSERT(settings);
2211 WINPR_ASSERT(cloned);
2213#if defined(have_pointer_list_indices)
2215 for (
size_t x = 0; x < ARRAYSIZE(pointer_list_indices); x++)
2217 const size_t key = pointer_list_indices[x];
2226 return log_result(rc);
2229static BOOL test_clone_copy(
const rdpSettings* settings,
const rdpSettings* cloned)
2233 WINPR_ASSERT(settings);
2234 WINPR_ASSERT(cloned);
2244 return log_result(rc);
2247static BOOL test_all(
void)
2253 rdpSettings* cloned =
nullptr;
2257 printf(
"Couldn't create settings\n");
2261 if (!test_string_len(settings))
2269 if (!test_bool_list(settings, cloned))
2271 if (!test_int16_list(settings, cloned))
2273 if (!test_uint16_list(settings, cloned))
2275 if (!test_int32_list(settings, cloned))
2277 if (!test_uint32_list(settings, cloned))
2279 if (!test_int64_list(settings, cloned))
2281 if (!test_uint64_list(settings, cloned))
2283 if (!test_string_list(settings, cloned))
2285 if (!test_pointer_list(settings, cloned))
2287 if (!test_clone_copy(settings, cloned))
2294 return log_result(rc);
2297#if defined(BUILD_TESTING_INTERNAL)
2298static FreeRDP_Settings_Keys_UInt32 getLenForKey(FreeRDP_Settings_Keys_Pointer key)
2300 return FreeRDP_TargetNetAddressCount;
2303static bool fillTargetBuffer(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key)
2306 for (
size_t x = 0; x < count; x++)
2308 char test[128] = WINPR_C_ARRAY_INIT;
2309 (void)_snprintf(test,
sizeof(test),
"test_value_%" PRIuz, x);
2310 if (!freerdp_settings_set_pointer_array(settings, key, x, test))
2316static bool checkTargetBuffer(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2319 for (
size_t x = 0; x < count; x++)
2321 char test[128] = WINPR_C_ARRAY_INIT;
2322 (void)_snprintf(test,
sizeof(test),
"test_value_%" PRIuz, x);
2323 const char* cmp = freerdp_settings_get_pointer_array(settings, key, x);
2326 if (strncmp(test, cmp,
sizeof(test)) != 0)
2332static bool checkTargetBufferResized(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2333 size_t count,
size_t newSize)
2335 if (count > newSize)
2338 if (!checkTargetBuffer(settings, key, count))
2341 for (
size_t x = count; x < newSize; x++)
2343 const char* cmp = freerdp_settings_get_pointer_array(settings, key, x);
2350static bool testSize(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
size_t newSize)
2352 if (!fillTargetBuffer(settings, key))
2355 if (!checkTargetBuffer(settings, key, count))
2357 if (key == FreeRDP_TargetNetAddresses)
2359 if (!freerdp_target_net_addresses_resize(settings, newSize))
2366 if (!checkTargetBufferResized(settings, key, count, newSize))
2371static bool testBufferResize(FreeRDP_Settings_Keys_Pointer key)
2378 if (!testSize(settings, key, 10))
2380 if (!testSize(settings, key, 23))
2382 if (!testSize(settings, key, 13))
2384 if (!testSize(settings, key, 0))
2394int TestSettings(
int argc,
char* argv[])
2400 if (!test_serialize())
2402 if (!test_dyn_channels())
2404 if (!test_static_channels())
2408 if (!test_helpers())
2410 if (!check_device_type())
2412 if (!test_pointer_array())
2414 if (!test_validity_check())
2418#if defined(BUILD_TESTING_INTERNAL)
2420 if (!testBufferResize(FreeRDP_TargetNetAddresses))
WINPR_API int WINPR_JSON_version(char *buffer, size_t len)
Get the library version string.
WINPR_ATTR_NODISCARD FREERDP_API const void * freerdp_settings_get_pointer(const rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a immutable pointer settings value.
FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 val)
Sets a UINT32 settings value.
FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API rdpSettings * freerdp_settings_clone(const rdpSettings *settings)
Creates a deep copy of settings.
FREERDP_API BOOL freerdp_settings_set_string_from_utf16N(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param, size_t length)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.
WINPR_ATTR_NODISCARD FREERDP_API SSIZE_T freerdp_settings_get_type_for_name(const char *value)
Get a key type for the name string of that key.
WINPR_ATTR_NODISCARD FREERDP_API INT32 freerdp_settings_get_int32(const rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id)
Returns a INT32 settings value.
FREERDP_API BOOL freerdp_settings_set_int16(rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id, INT16 val)
Sets a INT16 settings value.
FREERDP_API BOOL freerdp_settings_set_pointer_len(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data, size_t len)
Set a pointer to value data.
WINPR_ATTR_NODISCARD FREERDP_API void * freerdp_settings_get_pointer_writable(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a mutable pointer settings value.
WINPR_ATTR_NODISCARD FREERDP_API rdpSettings * freerdp_settings_deserialize(const char *jstr, size_t length)
A function that converts a JSON string to a rdpSettings struct.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_codecs_flags(const rdpSettings *settings)
helper function to get a mask of supported codec flags.
WINPR_ATTR_NODISCARD FREERDP_API UINT16 freerdp_settings_get_uint16(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id)
Returns a UINT16 settings value.
WINPR_ATTR_NODISCARD FREERDP_API UINT64 freerdp_settings_get_uint64(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id)
Returns a UINT64 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_copy(rdpSettings *dst, const rdpSettings *src)
Deep copies settings from src to dst.
FREERDP_API BOOL freerdp_settings_set_pointer(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *val)
Set a pointer to value val.
FREERDP_API BOOL freerdp_settings_set_uint64(rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id, UINT64 val)
Sets a UINT64 settings value.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
#define FREERDP_SETTINGS_SERVER_MODE
WINPR_ATTR_NODISCARD FREERDP_API INT16 freerdp_settings_get_int16(const rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id)
Returns a INT16 settings value.
WINPR_ATTR_NODISCARD FREERDP_API SSIZE_T freerdp_settings_get_key_for_name(const char *value)
Get a key index for the name string of that key.
WINPR_ATTR_NODISCARD FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API INT64 freerdp_settings_get_int64(const rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id)
Returns a INT64 settings value.
WINPR_ATTR_NODISCARD FREERDP_API char * freerdp_settings_serialize(const rdpSettings *settings, BOOL pretty, size_t *plength)
A function that converts a rdpSettings struct to a JSON serialized string.
FREERDP_API BOOL freerdp_settings_set_int32(rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id, INT32 val)
Sets a INT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API WCHAR * freerdp_settings_get_string_as_utf16(const rdpSettings *settings, FreeRDP_Settings_Keys_String id, size_t *pCharLen)
Return an allocated UTF16 string.
FREERDP_API BOOL freerdp_settings_set_string_from_utf16(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const WCHAR *param)
Sets a string settings value. The param is converted to UTF-8 and the copy stored.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_monitor_def_array_sorted(rdpSettings *settings, const rdpMonitor *monitors, size_t count)
Sort monitor array according to:
FREERDP_API BOOL freerdp_settings_set_int64(rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id, INT64 val)
Sets a INT64 settings value.
FREERDP_API BOOL freerdp_settings_set_uint16(rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id, UINT16 val)
Sets a UINT16 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_name_for_key(SSIZE_T key)
Returns the type name for a key.
FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *val, size_t len)
Sets a string settings value. The val is copied.
FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *val)
Sets a string settings value. The param is copied.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_print_diff(wLog *log, DWORD level, const rdpSettings *settings, const rdpSettings *other)
Dumps the difference between two settings structs to a WLog.
WINPR_ATTR_NODISCARD FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key)
Get a key type for the key index.