4#include <winpr/crypto.h>
7#include <freerdp/settings.h>
8#include <freerdp/codecs.h>
10#include "settings_property_lists.h"
11#include "../settings.h"
13#define log_start() log_start_(__func__)
14static void log_start_(
const char* fkt, ...)
16 (void)fprintf(stderr,
"TestSettings [");
19 (void)vfprintf(stderr, fkt, ap);
21 (void)fprintf(stderr,
"] started...\n");
25#define log_result(value) log_result_((value), __func__)
26static BOOL log_result_(BOOL value,
const char* fkt, ...)
28 (void)fprintf(stderr,
"TestSettings [");
31 (void)vfprintf(stderr, fkt, ap);
33 (void)fprintf(stderr,
"] returned %s\n", value ?
"TRUE" :
"FALSE");
38static BOOL log_result_case(BOOL value,
const char* fkt,
size_t testcase)
40 (void)fprintf(stderr,
"TestSettings [%s] testcase %" PRIuz
" returned %s\n", fkt, testcase,
41 value ?
"TRUE" :
"FALSE");
55 if (got->argc != expect->argc)
58 for (
int x = 0; x < expect->argc; x++)
60 if (strcmp(got->argv[x], expect->argv[x]) != 0)
63 return log_result(rc);
66static BOOL test_dyn_channels(
void)
73 const char* argv1[] = {
"foobar" };
76 const char* argv2[] = {
"gaga",
"abba",
"foo" };
89 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
92 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
97 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
98 test = freerdp_dynamic_channel_collection_add(settings, args1);
110 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
111 test = freerdp_dynamic_channel_collection_add(settings, args2);
124 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
125 if (!compare(got, cmp1))
127 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
128 if (!compare(got, cmp2))
130 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
139 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
140 if (compare(got, cmp1))
142 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
143 if (!compare(got, cmp2))
145 test = freerdp_dynamic_channel_collection_del(settings,
"gaga");
151 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
152 if (compare(got, cmp1))
154 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
155 if (compare(got, cmp2))
162 freerdp_addin_argv_free(args1);
163 freerdp_addin_argv_free(args2);
164 return log_result(rc);
167static BOOL test_static_channels(
void)
174 const char* argv1[] = {
"foobar" };
177 const char* argv2[] = {
"gaga",
"abba",
"foo" };
190 test = freerdp_static_channel_collection_del(settings,
"foobar");
193 got = freerdp_static_channel_collection_find(settings,
"foobar");
198 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
199 test = freerdp_static_channel_collection_add(settings, args1);
211 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
212 test = freerdp_static_channel_collection_add(settings, args2);
225 got = freerdp_static_channel_collection_find(settings,
"foobar");
226 if (!compare(got, cmp1))
228 got = freerdp_static_channel_collection_find(settings,
"gaga");
229 if (!compare(got, cmp2))
231 test = freerdp_static_channel_collection_del(settings,
"foobar");
240 got = freerdp_static_channel_collection_find(settings,
"foobar");
241 if (compare(got, cmp1))
243 got = freerdp_static_channel_collection_find(settings,
"gaga");
244 if (!compare(got, cmp2))
246 test = freerdp_static_channel_collection_del(settings,
"gaga");
252 got = freerdp_static_channel_collection_find(settings,
"foobar");
253 if (compare(got, cmp1))
255 got = freerdp_static_channel_collection_find(settings,
"gaga");
256 if (compare(got, cmp2))
263 freerdp_addin_argv_free(args1);
264 freerdp_addin_argv_free(args2);
265 return log_result(rc);
268static BOOL test_copy(
void)
272 wLog* log = WLog_Get(__func__);
277 if (!settings || !copy || !modified)
292 return log_result(rc);
295static BOOL test_helpers(
void)
308 if (flags != FREERDP_CODEC_ALL)
314 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_NSCODEC))
320 if (flags != (FREERDP_CODEC_ALL & ~(FREERDP_CODEC_NSCODEC | FREERDP_CODEC_REMOTEFX)))
326 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_REMOTEFX))
332 return log_result(rc);
335static BOOL format_uint(
char* buffer,
size_t size, UINT64 value, UINT16 intType, UINT64 max)
337 const UINT64 lvalue = value > max ? max : value;
338 intType = intType % 3;
342 (void)_snprintf(buffer, size,
"%" PRIu64, lvalue);
345 (void)_snprintf(buffer, size,
"0x%" PRIx64, lvalue);
348 if (max < UINT64_MAX)
349 (void)_snprintf(buffer, size,
"%" PRIu64, max + 1);
351 (
void)_snprintf(buffer, size,
"too large a number");
354 (void)_snprintf(buffer, size,
"not a number value");
359static BOOL print_negative(
char* buffer,
size_t size, INT64 value, INT64 min)
364 (void)_snprintf(buffer, size,
"%" PRId16, (INT16)value);
367 (void)_snprintf(buffer, size,
"%" PRId32, (INT32)value);
370 (void)_snprintf(buffer, size,
"%" PRId64, value);
373 (void)_snprintf(buffer, size,
"too small a number");
378static BOOL print_xpositive(
char* buffer,
size_t size, INT64 value, INT64 max)
382 (void)_snprintf(buffer, size,
"%" PRId64, value);
389 (void)_snprintf(buffer, size,
"%" PRIx16, (INT16)value);
392 (void)_snprintf(buffer, size,
"%" PRIx32, (INT32)value);
395 (void)_snprintf(buffer, size,
"%" PRIx64, value);
398 (void)_snprintf(buffer, size,
"too small a number");
403static BOOL format_int(
char* buffer,
size_t size, INT64 value, UINT16 intType, INT64 max, INT64 min)
405 const INT64 lvalue = (value > max) ? max : ((value < min) ? min : value);
406 intType = intType % 4;
411 (void)_snprintf(buffer, size,
"%" PRId64, lvalue);
414 print_xpositive(buffer, size, lvalue, max);
418 (void)_snprintf(buffer, size,
"%" PRId64, max + 1);
420 (
void)_snprintf(buffer, size,
"too large a number");
424 print_negative(buffer, size, min - 1, INT64_MIN);
426 (
void)_snprintf(buffer, size,
"too small a number");
429 (void)_snprintf(buffer, size,
"not a number value");
434static BOOL format_bool(
char* buffer,
size_t size, UINT16 intType)
436 intType = intType % 10;
440 (void)_snprintf(buffer, size,
"FALSE");
443 (void)_snprintf(buffer, size,
"FaLsE");
446 (void)_snprintf(buffer, size,
"False");
449 (void)_snprintf(buffer, size,
"false");
452 (void)_snprintf(buffer, size,
"falseentry");
455 (void)_snprintf(buffer, size,
"TRUE");
458 (void)_snprintf(buffer, size,
"TrUe");
461 (void)_snprintf(buffer, size,
"True");
464 (void)_snprintf(buffer, size,
"true");
467 (void)_snprintf(buffer, size,
"someentry");
470 (void)_snprintf(buffer, size,
"ok");
475static BOOL check_key_helpers(
size_t key,
const char* stype)
478 int test_rounds = 100;
480 rdpSettings* settings = NULL;
484 const size_t clear_keys[] = { FreeRDP_RdpServerCertificate,
485 FreeRDP_RdpServerRsaKey,
486 FreeRDP_RedirectionPassword,
487 FreeRDP_RedirectionTsvUrl,
488 FreeRDP_LoadBalanceInfo,
489 FreeRDP_ServerRandom,
490 FreeRDP_ClientRandom,
491 FreeRDP_ServerCertificate,
492 FreeRDP_TargetNetAddresses,
493 FreeRDP_ReceivedCapabilities,
494 FreeRDP_ServerLicenseProductIssuers,
495 FreeRDP_TargetNetPorts,
497 FreeRDP_ChannelDefArray,
498 FreeRDP_MonitorDefArray,
499 FreeRDP_ClientAutoReconnectCookie,
500 FreeRDP_ServerAutoReconnectCookie,
501 FreeRDP_ClientTimeZone,
502 FreeRDP_BitmapCacheV2CellInfo,
505 FreeRDP_StaticChannelArray,
506 FreeRDP_DynamicChannelArray,
507 FreeRDP_ReceivedCapabilities,
508 FreeRDP_OrderSupport,
509 FreeRDP_MonitorIds };
513 printf(
"[%s] missing name for key %" PRIuz
"\n", stype, key);
519 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
522 if ((
size_t)tkey != key)
524 printf(
"[%s] mismatch reverse name for key %s [%" PRIuz
"]: %" PRIdz
"\n", stype, name, key,
531 printf(
"[%s] missing reverse type for key %s [%" PRIuz
"]\n", stype, name, key);
537 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
543 printf(
"[%s] mismatch reverse type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
544 stype, name, key, rc, type);
551 printf(
"[%s] freerdp_settings_new failed\n", stype);
554 for (
size_t x = 0; x < ARRAYSIZE(clear_keys); x++)
556 const size_t id = clear_keys[x];
560 printf(
"[%s] freerdp_settings_set_pointer_len(%s, NULL, 0) failed\n", stype, foo);
566 UINT16 intEntryType = 0;
569 char value[8192] = { 0 };
581 winpr_RAND(&intEntryType,
sizeof(intEntryType));
582 winpr_RAND(&val.u64,
sizeof(val.u64));
586 case FreeRDP_ReceivedCapabilitiesSize:
587 case FreeRDP_TargetNetAddressCount:
596 case RDP_SETTINGS_TYPE_BOOL:
597 expect = format_bool(value,
sizeof(value), intEntryType);
599 case RDP_SETTINGS_TYPE_UINT16:
600 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT16_MAX);
602 case RDP_SETTINGS_TYPE_INT16:
604 format_int(value,
sizeof(value), val.i64, intEntryType, INT16_MAX, INT16_MIN);
606 case RDP_SETTINGS_TYPE_UINT32:
607 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT32_MAX);
609 case RDP_SETTINGS_TYPE_INT32:
611 format_int(value,
sizeof(value), val.i64, intEntryType, INT32_MAX, INT32_MIN);
613 case RDP_SETTINGS_TYPE_UINT64:
614 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT64_MAX);
616 case RDP_SETTINGS_TYPE_INT64:
618 format_int(value,
sizeof(value), val.i64, intEntryType, INT64_MAX, INT64_MIN);
620 case RDP_SETTINGS_TYPE_STRING:
622 (void)_snprintf(value,
sizeof(value),
"somerandomstring");
624 case RDP_SETTINGS_TYPE_POINTER:
629 printf(
"[%s] invalid type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
630 stype, name, key, rc, type);
634 have = freerdp_settings_set_value_for_name(settings, name, value);
637 printf(
"[%s] %s=%s have [%s] != expect[%s]\n", stype, name, value,
638 have ?
"TRUE" :
"FALSE", expect ?
"TRUE" :
"FALSE");
642 }
while (test_rounds-- > 0);
647 return log_result(res);
650static BOOL check_args(
const RDPDR_DEVICE* what,
size_t count,
const char* args[])
656 if (strcmp(what->Name, args[0]) != 0)
662 case RDPDR_DTYP_PRINT:
669 return strcmp(a->DriverName, args[1]) == 0;
672 case RDPDR_DTYP_SERIAL:
680 if (strcmp(a->Path, args[1]) != 0)
688 if (strcmp(a->Driver, args[2]) != 0)
696 if (strcmp(a->Permissive, args[3]) != 0)
702 case RDPDR_DTYP_PARALLEL:
709 return strcmp(a->Path, args[1]) == 0;
712 case RDPDR_DTYP_SMARTCARD:
715 case RDPDR_DTYP_FILESYSTEM:
722 if (strcmp(a->Path, args[1]) != 0)
727 return a->automount == (args[2] == NULL) ? TRUE : FALSE;
730 return !a->automount;
738static int check_device_type_arg(UINT32 Type,
size_t count,
const char* args[])
741 RDPDR_DEVICE* device = freerdp_device_new(Type, count, args);
752 if (!check_args(device, count, args))
756 if (!freerdp_device_equal(clone, device))
761 freerdp_device_free(device);
762 freerdp_device_free(clone);
763 return log_result(rc);
766static BOOL check_device_type(
void)
776 const char* args[] = {
"somename",
"anothername",
"3rdname",
"4thname" };
777 const struct test_entry tests[] = {
778 { 1, RDPDR_DTYP_SERIAL, 0, NULL },
779 { 1, RDPDR_DTYP_SERIAL, 0, args },
780 { 1, RDPDR_DTYP_SERIAL, 1, args },
781 { 1, RDPDR_DTYP_SERIAL, 2, args },
782 { 1, RDPDR_DTYP_SERIAL, 3, args },
783 { 1, RDPDR_DTYP_SERIAL, 4, args },
784 { 1, RDPDR_DTYP_PARALLEL, 0, NULL },
785 { 1, RDPDR_DTYP_PARALLEL, 0, args },
786 { 1, RDPDR_DTYP_PARALLEL, 1, args },
787 { 1, RDPDR_DTYP_PARALLEL, 2, args },
788 { 1, RDPDR_DTYP_PARALLEL, 3, args },
789 { 1, RDPDR_DTYP_PARALLEL, 4, args },
790 { 1, RDPDR_DTYP_PRINT, 0, NULL },
791 { 1, RDPDR_DTYP_PRINT, 0, args },
792 { 1, RDPDR_DTYP_PRINT, 1, args },
793 { 1, RDPDR_DTYP_PRINT, 2, args },
794 { 1, RDPDR_DTYP_PRINT, 3, args },
795 { 1, RDPDR_DTYP_PRINT, 4, args },
796 { 1, RDPDR_DTYP_FILESYSTEM, 0, NULL },
797 { 1, RDPDR_DTYP_FILESYSTEM, 0, args },
798 { 1, RDPDR_DTYP_FILESYSTEM, 1, args },
799 { 1, RDPDR_DTYP_FILESYSTEM, 2, args },
800 { 1, RDPDR_DTYP_FILESYSTEM, 3, args },
801 { 1, RDPDR_DTYP_FILESYSTEM, 4, args },
802 { 1, RDPDR_DTYP_SMARTCARD, 0, NULL },
803 { 1, RDPDR_DTYP_SMARTCARD, 0, args },
804 { 1, RDPDR_DTYP_SMARTCARD, 1, args },
805 { 1, RDPDR_DTYP_SMARTCARD, 2, args },
806 { 1, RDPDR_DTYP_SMARTCARD, 3, args },
807 { 1, RDPDR_DTYP_SMARTCARD, 4, args },
808 { -3, 0x123, 0, NULL },
809 { -3, 0x123, 0, args },
810 { -3, 0x123, 1, args },
811 { -3, 0x123, 2, args },
812 { -3, 0x123, 3, args },
813 { -3, 0x123, 4, args },
816 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
818 const struct test_entry* cur = &tests[x];
819 int got = check_device_type_arg(cur->type, cur->count, cur->args);
820 if (got != cur->expect)
823 return log_result(rc);
826static BOOL check_offsets(rdpSettings* settings,
size_t id,
size_t min,
size_t max, BOOL checkPtr)
830 WINPR_ASSERT(settings);
835 for (
size_t x = min; x < max; x++)
837 const void* ptr = freerdp_settings_get_pointer_array(settings,
id, x);
838 if (!ptr && checkPtr)
841 return log_result(rc);
844static BOOL test_write_offsets(rdpSettings* settings,
size_t id,
size_t elementSize,
size_t min,
847 WINPR_ASSERT(settings);
849 for (
size_t x = min; x < max; x++)
851 const void* ptr = NULL;
852 char buffer[8192] = { 0 };
854 winpr_RAND(buffer,
sizeof(buffer));
855 if (!freerdp_settings_set_pointer_array(settings,
id, x, buffer))
857 ptr = freerdp_settings_get_pointer_array(settings,
id, x);
860 if (memcmp(ptr, buffer, elementSize) != 0)
866static BOOL test_pointer_array(
void)
868 struct pointer_test_case
877 const struct pointer_test_case tests[] = {
878 { FALSE, FALSE, FreeRDP_DeviceArray, FreeRDP_DeviceArraySize, 32,
sizeof(
RDPDR_DEVICE*) },
879 { FALSE, FALSE, FreeRDP_StaticChannelArray, FreeRDP_StaticChannelArraySize, 32,
881 { FALSE, FALSE, FreeRDP_DynamicChannelArray, FreeRDP_DynamicChannelArraySize, 33,
883 { TRUE, TRUE, FreeRDP_BitmapCacheV2CellInfo, FreeRDP_BitmapCacheV2NumCells, 5,
885 { FALSE, FALSE, FreeRDP_OrderSupport, -1, 32,
sizeof(BYTE) },
886 { FALSE, FALSE, FreeRDP_ReceivedCapabilities, -1, 32,
sizeof(BYTE) },
889 { TRUE, TRUE, FreeRDP_MonitorIds, FreeRDP_NumMonitorIds, 33,
sizeof(UINT32) },
890 { TRUE, TRUE, FreeRDP_ChannelDefArray, FreeRDP_ChannelDefArraySize, 42,
892 { TRUE, TRUE, FreeRDP_MonitorDefArray, FreeRDP_MonitorDefArraySize, 33,
895 { FALSE, FALSE, FreeRDP_RdpServerCertificate, -1, 1,
sizeof(rdpCertificate*) },
897 { TRUE, TRUE, FreeRDP_RedirectionPassword, FreeRDP_RedirectionPasswordLength, 42,
899 { TRUE, TRUE, FreeRDP_RedirectionTsvUrl, FreeRDP_RedirectionTsvUrlLength, 42,
901 { TRUE, TRUE, FreeRDP_LoadBalanceInfo, FreeRDP_LoadBalanceInfoLength, 42,
sizeof(char) },
902 { TRUE, TRUE, FreeRDP_ServerRandom, FreeRDP_ServerRandomLength, 42,
sizeof(char) },
903 { TRUE, TRUE, FreeRDP_ClientRandom, FreeRDP_ClientRandomLength, 42,
sizeof(char) },
904 { TRUE, TRUE, FreeRDP_ServerCertificate, FreeRDP_ServerCertificateLength, 42,
914 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
916 const struct pointer_test_case* cur = &tests[x];
919 if (cur->sizeId >= 0)
925 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
927 if (check_offsets(settings, cur->id, cur->size, cur->size + 5, TRUE))
931 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
933 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
938 if (cur->sizeId >= 0)
944 if (check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
948 if (test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
953 if (cur->sizeId >= 0)
959 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
961 if (check_offsets(settings, cur->id, cur->size + 1, cur->size + 5, TRUE))
965 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
967 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
976 return log_result(rc);
979struct validity_test_case
986static BOOL prepare_monitor_array(rdpSettings* settings,
const struct validity_test_case* testcase)
988 WINPR_ASSERT(settings);
989 WINPR_ASSERT(testcase);
995static BOOL check_primary_offset(
const rdpSettings* settings,
const rdpMonitor* monitors,
999 for (
size_t x = 0; x < count; x++)
1002 if (cur->is_primary)
1007 for (
size_t x = 0; x < count; x++)
1010 if ((cur->x == 0) && (cur->y == 0))
1015 for (
size_t x = 0; x < count; x++)
1018 freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorDefArray, x);
1021 if (cur->is_primary)
1025 if (!sprimary || !cprimary)
1028 const INT32 xoff = cprimary->x;
1029 const INT32 yoff = cprimary->y;
1039static BOOL test_validity_check(
void)
1054 .attributes = { .physicalWidth = 100,
1055 .physicalHeight = 100,
1056 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1057 .desktopScaleFactor = 100,
1058 .deviceScaleFactor = 100 } }
1060 const rdpMonitor single_monitor_invalid_1[] = {
1067 .attributes = { .physicalWidth = 100,
1068 .physicalHeight = 100,
1069 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1070 .desktopScaleFactor = 100,
1071 .deviceScaleFactor = 100 } }
1073 const rdpMonitor single_monitor_invalid_2[] = {
1080 .attributes = { .physicalWidth = 100,
1081 .physicalHeight = 100,
1082 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1083 .desktopScaleFactor = 100,
1084 .deviceScaleFactor = 100 } }
1086 const rdpMonitor single_monitor_invalid_3[] = {
1093 .attributes = { .physicalWidth = 100,
1094 .physicalHeight = 100,
1095 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1096 .desktopScaleFactor = 100,
1097 .deviceScaleFactor = 100 } }
1099 const rdpMonitor single_monitor_invalid_4[] = {
1106 .attributes = { .physicalWidth = 100,
1107 .physicalHeight = 100,
1108 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1109 .desktopScaleFactor = 100,
1110 .deviceScaleFactor = 100 } }
1117 .is_primary = FALSE,
1119 .attributes = { .physicalWidth = 100,
1120 .physicalHeight = 100,
1121 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1122 .desktopScaleFactor = 100,
1123 .deviceScaleFactor = 100 } },
1128 .is_primary = FALSE,
1130 .attributes = { .physicalWidth = 100,
1131 .physicalHeight = 100,
1132 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1133 .desktopScaleFactor = 100,
1134 .deviceScaleFactor = 100 } },
1139 .is_primary = FALSE,
1141 .attributes = { .physicalWidth = 100,
1142 .physicalHeight = 100,
1143 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1144 .desktopScaleFactor = 100,
1145 .deviceScaleFactor = 100 } },
1150 .is_primary = FALSE,
1152 .attributes = { .physicalWidth = 100,
1153 .physicalHeight = 100,
1154 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1155 .desktopScaleFactor = 100,
1156 .deviceScaleFactor = 100 } },
1163 .attributes = { .physicalWidth = 100,
1164 .physicalHeight = 100,
1165 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1166 .desktopScaleFactor = 100,
1167 .deviceScaleFactor = 100 } },
1172 .is_primary = FALSE,
1174 .attributes = { .physicalWidth = 100,
1175 .physicalHeight = 100,
1176 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1177 .desktopScaleFactor = 100,
1178 .deviceScaleFactor = 100 } },
1183 .is_primary = FALSE,
1185 .attributes = { .physicalWidth = 100,
1186 .physicalHeight = 100,
1187 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1188 .desktopScaleFactor = 100,
1189 .deviceScaleFactor = 100 } },
1194 .is_primary = FALSE,
1196 .attributes = { .physicalWidth = 100,
1197 .physicalHeight = 100,
1198 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1199 .desktopScaleFactor = 100,
1200 .deviceScaleFactor = 100 } },
1205 .is_primary = FALSE,
1207 .attributes = { .physicalWidth = 100,
1208 .physicalHeight = 100,
1209 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1210 .desktopScaleFactor = 100,
1211 .deviceScaleFactor = 100 } },
1216 .is_primary = FALSE,
1218 .attributes = { .physicalWidth = 100,
1219 .physicalHeight = 100,
1220 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1221 .desktopScaleFactor = 100,
1222 .deviceScaleFactor = 100 } },
1227 .is_primary = FALSE,
1229 .attributes = { .physicalWidth = 100,
1230 .physicalHeight = 100,
1231 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1232 .desktopScaleFactor = 100,
1233 .deviceScaleFactor = 100 } },
1238 .is_primary = FALSE,
1240 .attributes = { .physicalWidth = 100,
1241 .physicalHeight = 100,
1242 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1243 .desktopScaleFactor = 100,
1244 .deviceScaleFactor = 100 } },
1246 const rdpMonitor multi_monitor_invalid_1[] = {
1251 .is_primary = FALSE,
1253 .attributes = { .physicalWidth = 100,
1254 .physicalHeight = 100,
1255 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1256 .desktopScaleFactor = 100,
1257 .deviceScaleFactor = 100 } },
1262 .is_primary = FALSE,
1264 .attributes = { .physicalWidth = 100,
1265 .physicalHeight = 100,
1266 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1267 .desktopScaleFactor = 100,
1268 .deviceScaleFactor = 100 } }
1270 const rdpMonitor multi_monitor_invalid_2[] = {
1275 .is_primary = FALSE,
1277 .attributes = { .physicalWidth = 100,
1278 .physicalHeight = 100,
1279 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1280 .desktopScaleFactor = 100,
1281 .deviceScaleFactor = 100 } },
1288 .attributes = { .physicalWidth = 100,
1289 .physicalHeight = 100,
1290 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1291 .desktopScaleFactor = 100,
1292 .deviceScaleFactor = 100 } }
1294 const rdpMonitor multi_monitor_invalid_3[] = {
1299 .is_primary = FALSE,
1301 .attributes = { .physicalWidth = 100,
1302 .physicalHeight = 100,
1303 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1304 .desktopScaleFactor = 100,
1305 .deviceScaleFactor = 100 } },
1312 .attributes = { .physicalWidth = 100,
1313 .physicalHeight = 100,
1314 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1315 .desktopScaleFactor = 100,
1316 .deviceScaleFactor = 100 } }
1318 const rdpMonitor multi_monitor_invalid_4[] = {
1323 .is_primary = FALSE,
1325 .attributes = { .physicalWidth = 100,
1326 .physicalHeight = 100,
1327 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1328 .desktopScaleFactor = 100,
1329 .deviceScaleFactor = 100 } },
1336 .attributes = { .physicalWidth = 100,
1337 .physicalHeight = 100,
1338 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1339 .desktopScaleFactor = 100,
1340 .deviceScaleFactor = 100 } }
1350 .attributes = { .physicalWidth = 100,
1351 .physicalHeight = 100,
1352 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1353 .desktopScaleFactor = 100,
1354 .deviceScaleFactor = 100 } },
1359 .is_primary = FALSE,
1361 .attributes = { .physicalWidth = 100,
1362 .physicalHeight = 100,
1363 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1364 .desktopScaleFactor = 100,
1365 .deviceScaleFactor = 100 } },
1370 .is_primary = FALSE,
1372 .attributes = { .physicalWidth = 100,
1373 .physicalHeight = 100,
1374 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1375 .desktopScaleFactor = 100,
1376 .deviceScaleFactor = 100 } }
1386 .attributes = { .physicalWidth = 100,
1387 .physicalHeight = 100,
1388 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1389 .desktopScaleFactor = 100,
1390 .deviceScaleFactor = 100 } },
1395 .is_primary = FALSE,
1397 .attributes = { .physicalWidth = 100,
1398 .physicalHeight = 100,
1399 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1400 .desktopScaleFactor = 100,
1401 .deviceScaleFactor = 100 } },
1406 .is_primary = FALSE,
1408 .attributes = { .physicalWidth = 100,
1409 .physicalHeight = 100,
1410 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1411 .desktopScaleFactor = 100,
1412 .deviceScaleFactor = 100 } }
1415 const struct validity_test_case tests[] = {
1416 { TRUE, ARRAYSIZE(single_monitor_valid), single_monitor_valid },
1417 { FALSE, ARRAYSIZE(single_monitor_invalid_1), single_monitor_invalid_1 },
1418 { FALSE, ARRAYSIZE(single_monitor_invalid_2), single_monitor_invalid_2 },
1419 { FALSE, ARRAYSIZE(single_monitor_invalid_3), single_monitor_invalid_3 },
1420 { FALSE, ARRAYSIZE(single_monitor_invalid_4), single_monitor_invalid_4 },
1421 { TRUE, ARRAYSIZE(multi_monitor_valid), multi_monitor_valid },
1422 { TRUE, ARRAYSIZE(multi_monitor_invalid_1), multi_monitor_invalid_1 },
1423 { FALSE, ARRAYSIZE(multi_monitor_invalid_2), multi_monitor_invalid_2 },
1424 { FALSE, ARRAYSIZE(multi_monitor_invalid_3), multi_monitor_invalid_3 },
1425 { FALSE, ARRAYSIZE(multi_monitor_invalid_4), multi_monitor_invalid_4 },
1426 { TRUE, ARRAYSIZE(multi_monitor_valid_2), multi_monitor_valid_2 },
1427 { TRUE, ARRAYSIZE(multi_monitor_valid_3), multi_monitor_valid_3 }
1431 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
1433 const struct validity_test_case* cur = &tests[x];
1435 if (!prepare_monitor_array(settings, cur))
1436 rc = log_result_case(FALSE, __func__, x);
1439#if defined(BUILD_TESTING_INTERNAL)
1440 const BOOL res = freerdp_settings_check_client_after_preconnect(settings);
1442 const BOOL res = cur->expected;
1445 if ((res != cur->expected) ||
1446 !check_primary_offset(settings, cur->monitors, cur->count))
1448 rc = log_result_case(FALSE, __func__, x);
1455 return log_result(rc);
1458static BOOL test_string_null(rdpSettings* settings, FreeRDP_Settings_Keys_String
id)
1464 return (chk == NULL);
1467static BOOL test_string_check(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1468 const char*
string,
size_t len)
1474 const size_t clen = strnlen(chk, len + 1);
1481 if (strncmp(
string, chk, clen) != 0)
1487static BOOL test_string_check_reset(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1488 const char*
string,
size_t len)
1490 return test_string_check(settings,
id,
string, len) && test_string_null(settings,
id);
1493static BOOL test_string_set_readback(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1494 const char*
string,
size_t len)
1496 WINPR_ASSERT(len > 3);
1501 const size_t slen = strnlen(
string, len);
1505 if (!test_string_check_reset(settings,
id,
string, slen - 1))
1513 if (!wstr || (wlen != slen))
1516 if (!test_string_check_reset(settings,
id,
string, slen))
1522 if (!test_string_check(settings,
id,
string, slen - 1))
1528 if (!test_string_check(settings,
id,
string, slen))
1537static BOOL test_string_len(rdpSettings* settings)
1541 const char user[] =
"abcdefg";
1542 if (!test_string_set_readback(settings, FreeRDP_Username, user,
sizeof(user)))
1545 const char pwd[] =
"xyz";
1546 if (!test_string_set_readback(settings, FreeRDP_Password, pwd,
sizeof(pwd)))
1549 const char domain[] =
"foobar";
1550 if (!test_string_set_readback(settings, FreeRDP_Domain, domain,
sizeof(domain)))
1558static BOOL test_serialize_with(rdpSettings* src,
const char* name)
1563 rdpSettings* dst = NULL;
1568 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_serialize");
1570 if (!str || (slen == 0))
1573 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_deserialize");
1578 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_print_diff");
1586 return log_result_(rc,
"%s-%s", name, __func__);
1589static BOOL test_serialize_strings(DWORD flags,
const char* str)
1596 for (SSIZE_T x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
1601 FreeRDP_Settings_Keys_Pointer ptr;
1608 case RDP_SETTINGS_TYPE_STRING:
1620 char buffer[128] = { 0 };
1621 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32
" {%s}", __func__, flags, str);
1622 return test_serialize_with(src, buffer);
1625static BOOL add_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1627 ADDIN_ARGV* val = freerdp_addin_argv_new(argc, argv);
1630 if (!freerdp_static_channel_collection_add(src, val))
1632 if (!freerdp_static_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1634 if (!freerdp_dynamic_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1640static BOOL add_dev_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1642 FreeRDP_Settings_Keys_Pointer key = FreeRDP_DeviceArray;
1647 const uint32_t types[] = { RDPDR_DTYP_SERIAL, RDPDR_DTYP_PARALLEL, RDPDR_DTYP_PRINT,
1648 RDPDR_DTYP_FILESYSTEM, RDPDR_DTYP_SMARTCARD };
1650 for (
size_t x = 0; x < count; x++)
1652 const uint32_t type = types[x % ARRAYSIZE(types)];
1653 RDPDR_DEVICE* arg = freerdp_device_new(type, argc, argv);
1656 const BOOL rc = freerdp_settings_set_pointer_array(src, key, x, arg);
1657 freerdp_device_free(arg);
1664static BOOL fill_random(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key,
size_t elem,
1672 winpr_RAND(data, len * elem);
1676static BOOL fill_random_timezone(rdpSettings* src)
1678 FreeRDP_Settings_Keys_Pointer key = FreeRDP_ClientTimeZone;
1685 (void)ConvertUtf8ToWChar(
"testXXXXDaylight", data->DaylightName, ARRAYSIZE(data->DaylightName));
1686 (void)ConvertUtf8ToWChar(
"testXXXX", data->StandardName, ARRAYSIZE(data->StandardName));
1691static BOOL set_private_key(rdpSettings* src)
1696 rdpPrivateKey* key =
1697 freerdp_settings_get_pointer_array_writable(src, FreeRDP_RdpServerRsaKey, 0);
1701 return freerdp_key_generate(key,
"RSA", 1, 4096);
1704static BOOL set_cert(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key)
1706 const char pem[] =
"-----BEGIN CERTIFICATE-----\n"
1707 "MIICvTCCAaWgAwIBAgIEZrM9yjANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAlt\n"
1708 "b3RvcmhlYWQwHhcNMjUwNDE1MTExMjE5WhcNMjYwNDE1MTExMjE5WjAUMRIwEAYD\n"
1709 "VQQDDAltb3RvcmhlYWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw\n"
1710 "g0tADY3kh5Hi6YsTsQbuaPs50zlTpIv+rCCK3BNIblsIh4cSO1YGdWfB0gP9bUD1\n"
1711 "L7mPWRnIiAvwrRA/Mgyo+UgiYj/aE3xxN3adB9/QsUzNrI07o6L8MupV4237txMj\n"
1712 "uxVmarB4c7E4wFgSxwbMQPhQtoNNew3bY+EeqhQBMFfYy4z+rg60xl0QHGcMePY/\n"
1713 "xz0WMHrIz6FhZfBIr+BGViRtjIchbjcU0HfTSujX+MT0D5MBISe8aiFvrewFItfT\n"
1714 "vglriDLeNMiB9U/aRLV8OtW+heGNhi5qSC9JXEW70OFeGAoqtwyRHLnSh38Fo2xv\n"
1715 "fEc90zjkCan8usEDKuzBAgMBAAGjFzAVMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0G\n"
1716 "CSqGSIb3DQEBCwUAA4IBAQBY1wkJ6XWduNmTi+UNdcZ5e9GWV/3+SYLtFALwKVrU\n"
1717 "KQQbsYnGLfyUKXFc7e9JoZ+UCTJgY3EyL+6p79io+cFeTtpp1RVKljibbeRAP01W\n"
1718 "WbcxcHZFKgBlH1KNSeO7iOAPet3aCaVDKl1XSU7fhxtsfBBI9YTtaMZM5e9WhuHK\n"
1719 "lL11Un6ePThX+4NG1yYp0X+emqUHd/qaq8IShnU6ajvzoloWGf4vLlDSsuFHJJsK\n"
1720 "LnshNFOFGAjp1Se4DjhtUSr6Xofdse+kx9cSQazCZ5vFJNeHkxr0B7ojQ4bN37Tg\n"
1721 "2uyfSclCCLnmjcoRMlIGUiL2bevCPDRNRWiblDgx3tGG\n"
1722 "-----END CERTIFICATE-----\n";
1724 rdpCertificate* cert = freerdp_certificate_new_from_pem(pem);
1730static BOOL set_string_array(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key, uint32_t max)
1733 winpr_RAND(&count,
sizeof(count));
1734 count = count % max;
1739 for (uint32_t x = 0; x < count; x++)
1741 char buffer[32] = { 0 };
1742 (void)_snprintf(buffer,
sizeof(buffer),
"foobar-0x%08" PRIu32, x);
1743 if (!freerdp_settings_set_pointer_array(src, key, x, buffer))
1749static BOOL test_serialize_pointer(DWORD flags)
1756 const char* argv1[] = {
"foobar",
"lala",
"haha" };
1757 const char* argv2[] = {
"lala",
"haha" };
1758 const char* argv3[] = {
"haha" };
1759 if (!add_argv(src, ARRAYSIZE(argv1), argv1))
1761 if (!add_argv(src, ARRAYSIZE(argv2), argv2))
1763 if (!add_argv(src, ARRAYSIZE(argv3), argv3))
1765 if (!add_dev_argv(src, ARRAYSIZE(argv3), argv3))
1770 FreeRDP_Settings_Keys_Pointer key;
1775 const struct key_len_pair keys[] = {
1776 { FreeRDP_ServerRandom, 1, 123 },
1777 { FreeRDP_RedirectionPassword, 1, 13 },
1778 { FreeRDP_ClientRandom, 1, 23 },
1779 { FreeRDP_RedirectionGuid, 1, 22 },
1780 { FreeRDP_LoadBalanceInfo, 1, 21 },
1781 { FreeRDP_ServerCertificate, 1, 512 },
1782 { FreeRDP_RedirectionTsvUrl, 1, 33 },
1786 { FreeRDP_OrderSupport, 1, 32 },
1789 { FreeRDP_Password51, 1, 54 },
1790 { FreeRDP_MonitorIds, 1, 111 },
1791 { FreeRDP_MonitorDefArray, 1, 7 },
1792 { FreeRDP_ChannelDefArray, 1, 31 },
1793 { FreeRDP_ReceivedCapabilities,
sizeof(uint8_t), 33 },
1794 { FreeRDP_ReceivedCapabilityData,
sizeof(uint8_t*), 33 },
1795 { FreeRDP_ReceivedCapabilityDataSizes,
sizeof(UINT32), 33 }
1798 for (
size_t x = 0; x < ARRAYSIZE(keys); x++)
1800 const struct key_len_pair* cur = &keys[x];
1801 if (!fill_random(src, cur->key, cur->elem, cur->len))
1805 if (!fill_random_timezone(src))
1809 winpr_RAND((
void*)&ptr,
sizeof(
void*));
1813 if (!set_private_key(src))
1815 if (!set_cert(src, FreeRDP_RedirectionTargetCertificate))
1817 if (!set_cert(src, FreeRDP_RdpServerCertificate))
1820 if (!set_string_array(src, FreeRDP_ServerLicenseProductIssuers, 43))
1823 char addresses[12][43] = { 0 };
1824 char* strptr[12] = { 0 };
1826 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1828 (void)_snprintf(addresses[x], 43,
"foobar-0x%08" PRIx32, x);
1829 strptr[x] = addresses[x];
1832 if (!freerdp_target_net_addresses_copy(src, strptr, ARRAYSIZE(addresses)))
1835 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1838 winpr_RAND(&port,
sizeof(port));
1839 if (!freerdp_settings_set_pointer_array(src, FreeRDP_TargetNetPorts, x, &port))
1850 winpr_RAND(caps, count);
1852 for (uint32_t x = 0; x < count; x++)
1854 uint8_t* buffer = calloc(64,
sizeof(uint8_t));
1857 winpr_RAND(buffer,
sizeof(buffer));
1858 uint32_t blen = (buffer[0] % 52) + 13;
1860 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityData, x, buffer))
1862 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityDataSizes, x, &blen))
1866 char buffer[128] = { 0 };
1867 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32, __func__, flags);
1868 return test_serialize_with(src, buffer);
1875static BOOL test_serialize(
void)
1885 for (uint32_t flags = 0;
1888 char buffer[32] = { 0 };
1889 (void)_snprintf(buffer,
sizeof(buffer),
"default (flags 0x%08" PRIx32
")", flags);
1892 if (!test_serialize_strings(flags,
"foobar"))
1894 if (!test_serialize_strings(flags,
""))
1896 if (!test_serialize_strings(flags, NULL))
1898 if (!test_serialize_pointer(flags))
1908static BOOL test_bool_list(
const rdpSettings* settings,
const rdpSettings* cloned)
1913 WINPR_ASSERT(settings);
1914 WINPR_ASSERT(cloned);
1916#if defined(have_bool_list_indices)
1918 for (
size_t x = 0; x < ARRAYSIZE(bool_list_indices); x++)
1920 const size_t key = bool_list_indices[x];
1927 printf(
"mismatch for key %s: %u -> copy %u\n", name, val, cval);
1932 if (!check_key_helpers(key,
"bool"))
1939 return log_result(rc);
1942static BOOL test_int16_list(
const rdpSettings* settings,
const rdpSettings* cloned)
1947 WINPR_ASSERT(settings);
1948 WINPR_ASSERT(cloned);
1950#if defined(have_int16_list_indices)
1952 for (
size_t x = 0; x < ARRAYSIZE(int16_list_indices); x++)
1954 const size_t key = int16_list_indices[x];
1960 printf(
"mismatch for key %s: %" PRId16
" -> copy %" PRId16
"\n", name, val, cval);
1965 if (!check_key_helpers(key,
"int16"))
1972 return log_result(rc);
1975static BOOL test_uint16_list(
const rdpSettings* settings,
const rdpSettings* cloned)
1980 WINPR_ASSERT(settings);
1981 WINPR_ASSERT(cloned);
1983#if defined(have_uint16_list_indices)
1985 for (
size_t x = 0; x < ARRAYSIZE(uint16_list_indices); x++)
1987 const size_t key = uint16_list_indices[x];
1994 printf(
"mismatch for key %s: %" PRIu16
" -> copy %" PRIu16
"\n", name, val, cval);
1999 if (!check_key_helpers(key,
"uint16"))
2006 return log_result(rc);
2009static BOOL test_int32_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2014 WINPR_ASSERT(settings);
2015 WINPR_ASSERT(cloned);
2017#if defined(have_int32_list_indices)
2019 for (
size_t x = 0; x < ARRAYSIZE(int32_list_indices); x++)
2021 const size_t key = int32_list_indices[x];
2028 printf(
"mismatch for key %s: %" PRId32
" -> copy %" PRId32
"\n", name, val, cval);
2033 if (!check_key_helpers(key,
"int32"))
2041 return log_result(rc);
2044static BOOL test_uint32_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2049 WINPR_ASSERT(settings);
2050 WINPR_ASSERT(cloned);
2052#if defined(have_uint32_list_indices)
2054 for (
size_t x = 0; x < ARRAYSIZE(uint32_list_indices); x++)
2056 const size_t key = uint32_list_indices[x];
2063 printf(
"mismatch for key %s: %" PRIu32
" -> copy %" PRIu32
"\n", name, val, cval);
2068 if (!check_key_helpers(key,
"uint32"))
2076 return log_result(rc);
2079static BOOL test_int64_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2084 WINPR_ASSERT(settings);
2085 WINPR_ASSERT(cloned);
2087#if defined(have_int64_list_indices)
2089 for (
size_t x = 0; x < ARRAYSIZE(int64_list_indices); x++)
2091 const size_t key = int64_list_indices[x];
2097 printf(
"mismatch for key %s: %" PRId64
" -> copy %" PRId64
"\n", name, val, cval);
2102 if (!check_key_helpers(key,
"int64"))
2110 return log_result(rc);
2113static BOOL test_uint64_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2118 WINPR_ASSERT(settings);
2119 WINPR_ASSERT(cloned);
2121#if defined(have_uint64_list_indices)
2123 for (
size_t x = 0; x < ARRAYSIZE(uint64_list_indices); x++)
2125 const size_t key = uint64_list_indices[x];
2132 printf(
"mismatch for key %s: %" PRIu64
" -> copy %" PRIu64
"\n", name, val, cval);
2137 if (!check_key_helpers(key,
"uint64"))
2145 return log_result(rc);
2148static BOOL test_string_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2153 WINPR_ASSERT(settings);
2154 WINPR_ASSERT(cloned);
2156#if defined(have_string_list_indices)
2158 for (
size_t x = 0; x < ARRAYSIZE(string_list_indices); x++)
2160 const size_t key = string_list_indices[x];
2161 const char val[] =
"test-string";
2162 const char* res = NULL;
2167 if ((oval != cval) && (strcmp(oval, cval) != 0))
2169 printf(
"mismatch for key %s: %s -> copy %s\n", name, oval, cval);
2177 if (strncmp(val, res,
sizeof(val)) != 0)
2185 return log_result(rc);
2188static BOOL test_pointer_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2193 WINPR_ASSERT(settings);
2194 WINPR_ASSERT(cloned);
2196#if defined(have_pointer_list_indices)
2198 for (
size_t x = 0; x < ARRAYSIZE(pointer_list_indices); x++)
2200 const size_t key = pointer_list_indices[x];
2209 return log_result(rc);
2212static BOOL test_clone_copy(
const rdpSettings* settings,
const rdpSettings* cloned)
2216 WINPR_ASSERT(settings);
2217 WINPR_ASSERT(cloned);
2227 return log_result(rc);
2230static BOOL test_all(
void)
2236 rdpSettings* cloned = NULL;
2240 printf(
"Couldn't create settings\n");
2244 if (!test_string_len(settings))
2252 if (!test_bool_list(settings, cloned))
2254 if (!test_int16_list(settings, cloned))
2256 if (!test_uint16_list(settings, cloned))
2258 if (!test_int32_list(settings, cloned))
2260 if (!test_uint32_list(settings, cloned))
2262 if (!test_int64_list(settings, cloned))
2264 if (!test_uint64_list(settings, cloned))
2266 if (!test_string_list(settings, cloned))
2268 if (!test_pointer_list(settings, cloned))
2270 if (!test_clone_copy(settings, cloned))
2277 return log_result(rc);
2280int TestSettings(
int argc,
char* argv[])
2286 if (!test_serialize())
2288 if (!test_dyn_channels())
2290 if (!test_static_channels())
2294 if (!test_helpers())
2296 if (!check_device_type())
2298 if (!test_pointer_array())
2300 if (!test_validity_check())
WINPR_API int WINPR_JSON_version(char *buffer, size_t len)
Get the library version string.
FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
FREERDP_API BOOL freerdp_settings_set_string(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.
FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
FREERDP_API INT64 freerdp_settings_get_int64(const rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id)
Returns a INT64 settings value.
FREERDP_API rdpSettings * freerdp_settings_clone(const rdpSettings *settings)
Creates a deep copy of settings.
FREERDP_API BOOL freerdp_settings_print_diff(wLog *log, DWORD level, const rdpSettings *src, const rdpSettings *other)
Dumps the difference between two settings structs to a WLog.
FREERDP_API SSIZE_T freerdp_settings_get_type_for_name(const char *value)
Get a key type for the name string of that key.
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.
FREERDP_API SSIZE_T freerdp_settings_get_type_for_key(SSIZE_T key)
Get a key type for the key index.
FREERDP_API UINT64 freerdp_settings_get_uint64(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id)
Returns a UINT64 settings value.
FREERDP_API SSIZE_T freerdp_settings_get_key_for_name(const char *value)
Get a key index for the name string of that key.
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.
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 param)
Sets a INT32 settings value.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
#define FREERDP_SETTINGS_SERVER_MODE
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 UINT16 freerdp_settings_get_uint16(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id)
Returns a UINT16 settings value.
FREERDP_API void * freerdp_settings_get_pointer_writable(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a mutable pointer settings value.
FREERDP_API BOOL freerdp_settings_copy(rdpSettings *dst, const rdpSettings *src)
Deep copies settings from src to dst.
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_uint64(rdpSettings *settings, FreeRDP_Settings_Keys_UInt64 id, UINT64 param)
Sets a UINT64 settings value.
FREERDP_API BOOL freerdp_settings_set_int16(rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id, INT16 param)
Sets a INT16 settings value.
FREERDP_API BOOL freerdp_settings_set_int64(rdpSettings *settings, FreeRDP_Settings_Keys_Int64 id, INT64 param)
Sets a INT64 settings value.
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.
FREERDP_API BOOL freerdp_settings_set_pointer(rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id, const void *data)
Set a pointer to value data.
FREERDP_API INT32 freerdp_settings_get_int32(const rdpSettings *settings, FreeRDP_Settings_Keys_Int32 id)
Returns a INT32 settings value.
FREERDP_API const void * freerdp_settings_get_pointer(const rdpSettings *settings, FreeRDP_Settings_Keys_Pointer id)
Returns a immutable pointer settings value.
FREERDP_API UINT32 freerdp_settings_get_codecs_flags(const rdpSettings *settings)
helper function to get a mask of supported codec flags.
FREERDP_API BOOL freerdp_settings_set_string_len(rdpSettings *settings, FreeRDP_Settings_Keys_String id, const char *param, size_t len)
Sets a string settings value. The param is copied.
FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 param)
Sets a UINT32 settings value.
FREERDP_API const char * freerdp_settings_get_name_for_key(SSIZE_T key)
Returns the type name for a key.
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
FREERDP_API BOOL freerdp_settings_set_uint16(rdpSettings *settings, FreeRDP_Settings_Keys_UInt16 id, UINT16 param)
Sets a UINT16 settings value.
FREERDP_API INT16 freerdp_settings_get_int16(const rdpSettings *settings, FreeRDP_Settings_Keys_Int16 id)
Returns a INT16 settings value.
FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL param)
Sets a BOOL settings value.
FREERDP_API rdpSettings * freerdp_settings_deserialize(const char *json, size_t length)
A function that converts a JSON string to a rdpSettings struct.