4#include <winpr/crypto.h>
6#include <freerdp/settings.h>
7#include <freerdp/codecs.h>
9#include "settings_property_lists.h"
10#include "../settings.h"
12static BOOL log_result(BOOL value,
const char* fkt)
14 (void)fprintf(stderr,
"TestSettings [%s] returned %s\n", fkt, value ?
"TRUE" :
"FALSE");
18static BOOL log_result_case(BOOL value,
const char* fkt,
size_t testcase)
20 (void)fprintf(stderr,
"TestSettings [%s] testcase %" PRIuz
" returned %s\n", fkt, testcase,
21 value ?
"TRUE" :
"FALSE");
34 if (got->argc != expect->argc)
37 for (
int x = 0; x < expect->argc; x++)
39 if (strcmp(got->argv[x], expect->argv[x]) != 0)
42 return log_result(rc, __func__);
45static BOOL test_dyn_channels(
void)
51 const char* argv1[] = {
"foobar" };
54 const char* argv2[] = {
"gaga",
"abba",
"foo" };
67 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
70 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
75 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
76 test = freerdp_dynamic_channel_collection_add(settings, args1);
88 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
89 test = freerdp_dynamic_channel_collection_add(settings, args2);
102 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
103 if (!compare(got, cmp1))
105 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
106 if (!compare(got, cmp2))
108 test = freerdp_dynamic_channel_collection_del(settings,
"foobar");
117 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
118 if (compare(got, cmp1))
120 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
121 if (!compare(got, cmp2))
123 test = freerdp_dynamic_channel_collection_del(settings,
"gaga");
129 got = freerdp_dynamic_channel_collection_find(settings,
"foobar");
130 if (compare(got, cmp1))
132 got = freerdp_dynamic_channel_collection_find(settings,
"gaga");
133 if (compare(got, cmp2))
140 freerdp_addin_argv_free(args1);
141 freerdp_addin_argv_free(args2);
142 return log_result(rc, __func__);
145static BOOL test_static_channels(
void)
151 const char* argv1[] = {
"foobar" };
154 const char* argv2[] = {
"gaga",
"abba",
"foo" };
167 test = freerdp_static_channel_collection_del(settings,
"foobar");
170 got = freerdp_static_channel_collection_find(settings,
"foobar");
175 cmp1 = args1 = freerdp_addin_argv_new(ARRAYSIZE(argv1), argv1);
176 test = freerdp_static_channel_collection_add(settings, args1);
188 cmp2 = args2 = freerdp_addin_argv_new(ARRAYSIZE(argv2), argv2);
189 test = freerdp_static_channel_collection_add(settings, args2);
202 got = freerdp_static_channel_collection_find(settings,
"foobar");
203 if (!compare(got, cmp1))
205 got = freerdp_static_channel_collection_find(settings,
"gaga");
206 if (!compare(got, cmp2))
208 test = freerdp_static_channel_collection_del(settings,
"foobar");
217 got = freerdp_static_channel_collection_find(settings,
"foobar");
218 if (compare(got, cmp1))
220 got = freerdp_static_channel_collection_find(settings,
"gaga");
221 if (!compare(got, cmp2))
223 test = freerdp_static_channel_collection_del(settings,
"gaga");
229 got = freerdp_static_channel_collection_find(settings,
"foobar");
230 if (compare(got, cmp1))
232 got = freerdp_static_channel_collection_find(settings,
"gaga");
233 if (compare(got, cmp2))
240 freerdp_addin_argv_free(args1);
241 freerdp_addin_argv_free(args2);
242 return log_result(rc, __func__);
245static BOOL test_copy(
void)
248 wLog* log = WLog_Get(__func__);
253 if (!settings || !copy || !modified)
268 return log_result(rc, __func__);
271static BOOL test_helpers(
void)
283 if (flags != FREERDP_CODEC_ALL)
289 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_NSCODEC))
295 if (flags != (FREERDP_CODEC_ALL & ~(FREERDP_CODEC_NSCODEC | FREERDP_CODEC_REMOTEFX)))
301 if (flags != (FREERDP_CODEC_ALL & ~FREERDP_CODEC_REMOTEFX))
307 return log_result(rc, __func__);
310static BOOL format_uint(
char* buffer,
size_t size, UINT64 value, UINT16 intType, UINT64 max)
312 const UINT64 lvalue = value > max ? max : value;
313 intType = intType % 3;
317 (void)_snprintf(buffer, size,
"%" PRIu64, lvalue);
320 (void)_snprintf(buffer, size,
"0x%" PRIx64, lvalue);
323 if (max < UINT64_MAX)
324 (void)_snprintf(buffer, size,
"%" PRIu64, max + 1);
326 (
void)_snprintf(buffer, size,
"too large a number");
329 (void)_snprintf(buffer, size,
"not a number value");
334static BOOL print_negative(
char* buffer,
size_t size, INT64 value, INT64 min)
339 (void)_snprintf(buffer, size,
"%" PRId16, (INT16)value);
342 (void)_snprintf(buffer, size,
"%" PRId32, (INT32)value);
345 (void)_snprintf(buffer, size,
"%" PRId64, value);
348 (void)_snprintf(buffer, size,
"too small a number");
353static BOOL print_xpositive(
char* buffer,
size_t size, INT64 value, INT64 max)
357 (void)_snprintf(buffer, size,
"%" PRId64, value);
364 (void)_snprintf(buffer, size,
"%" PRIx16, (INT16)value);
367 (void)_snprintf(buffer, size,
"%" PRIx32, (INT32)value);
370 (void)_snprintf(buffer, size,
"%" PRIx64, value);
373 (void)_snprintf(buffer, size,
"too small a number");
378static BOOL format_int(
char* buffer,
size_t size, INT64 value, UINT16 intType, INT64 max, INT64 min)
380 const INT64 lvalue = (value > max) ? max : ((value < min) ? min : value);
381 intType = intType % 4;
386 (void)_snprintf(buffer, size,
"%" PRId64, lvalue);
389 print_xpositive(buffer, size, lvalue, max);
393 (void)_snprintf(buffer, size,
"%" PRId64, max + 1);
395 (
void)_snprintf(buffer, size,
"too large a number");
399 print_negative(buffer, size, min - 1, INT64_MIN);
401 (
void)_snprintf(buffer, size,
"too small a number");
404 (void)_snprintf(buffer, size,
"not a number value");
409static BOOL format_bool(
char* buffer,
size_t size, UINT16 intType)
411 intType = intType % 10;
415 (void)_snprintf(buffer, size,
"FALSE");
418 (void)_snprintf(buffer, size,
"FaLsE");
421 (void)_snprintf(buffer, size,
"False");
424 (void)_snprintf(buffer, size,
"false");
427 (void)_snprintf(buffer, size,
"falseentry");
430 (void)_snprintf(buffer, size,
"TRUE");
433 (void)_snprintf(buffer, size,
"TrUe");
436 (void)_snprintf(buffer, size,
"True");
439 (void)_snprintf(buffer, size,
"true");
442 (void)_snprintf(buffer, size,
"someentry");
445 (void)_snprintf(buffer, size,
"ok");
450static BOOL check_key_helpers(
size_t key,
const char* stype)
452 int test_rounds = 100;
454 rdpSettings* settings = NULL;
458 const size_t clear_keys[] = { FreeRDP_RdpServerCertificate,
459 FreeRDP_RdpServerRsaKey,
460 FreeRDP_RedirectionPassword,
461 FreeRDP_RedirectionTsvUrl,
462 FreeRDP_LoadBalanceInfo,
463 FreeRDP_ServerRandom,
464 FreeRDP_ClientRandom,
465 FreeRDP_ServerCertificate,
466 FreeRDP_TargetNetAddresses,
467 FreeRDP_ReceivedCapabilities,
468 FreeRDP_ServerLicenseProductIssuers,
469 FreeRDP_TargetNetPorts,
471 FreeRDP_ChannelDefArray,
472 FreeRDP_MonitorDefArray,
473 FreeRDP_ClientAutoReconnectCookie,
474 FreeRDP_ServerAutoReconnectCookie,
475 FreeRDP_ClientTimeZone,
476 FreeRDP_BitmapCacheV2CellInfo,
479 FreeRDP_StaticChannelArray,
480 FreeRDP_DynamicChannelArray,
481 FreeRDP_ReceivedCapabilities,
482 FreeRDP_OrderSupport,
483 FreeRDP_MonitorIds };
487 printf(
"[%s] missing name for key %" PRIuz
"\n", stype, key);
493 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
496 if ((
size_t)tkey != key)
498 printf(
"[%s] mismatch reverse name for key %s [%" PRIuz
"]: %" PRIdz
"\n", stype, name, key,
505 printf(
"[%s] missing reverse type for key %s [%" PRIuz
"]\n", stype, name, key);
511 printf(
"[%s] missing reverse name for key %s [%" PRIuz
"]\n", stype, name, key);
517 printf(
"[%s] mismatch reverse type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
518 stype, name, key, rc, type);
525 printf(
"[%s] freerdp_settings_new failed\n", stype);
528 for (
size_t x = 0; x < ARRAYSIZE(clear_keys); x++)
530 const size_t id = clear_keys[x];
534 printf(
"[%s] freerdp_settings_set_pointer_len(%s, NULL, 0) failed\n", stype, foo);
540 UINT16 intEntryType = 0;
543 char value[8192] = { 0 };
555 winpr_RAND(&intEntryType,
sizeof(intEntryType));
556 winpr_RAND(&val.u64,
sizeof(val.u64));
560 case RDP_SETTINGS_TYPE_BOOL:
561 expect = format_bool(value,
sizeof(value), intEntryType);
563 case RDP_SETTINGS_TYPE_UINT16:
564 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT16_MAX);
566 case RDP_SETTINGS_TYPE_INT16:
568 format_int(value,
sizeof(value), val.i64, intEntryType, INT16_MAX, INT16_MIN);
570 case RDP_SETTINGS_TYPE_UINT32:
571 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT32_MAX);
573 case RDP_SETTINGS_TYPE_INT32:
575 format_int(value,
sizeof(value), val.i64, intEntryType, INT32_MAX, INT32_MIN);
577 case RDP_SETTINGS_TYPE_UINT64:
578 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT64_MAX);
580 case RDP_SETTINGS_TYPE_INT64:
582 format_int(value,
sizeof(value), val.i64, intEntryType, INT64_MAX, INT64_MIN);
584 case RDP_SETTINGS_TYPE_STRING:
586 (void)_snprintf(value,
sizeof(value),
"somerandomstring");
588 case RDP_SETTINGS_TYPE_POINTER:
593 printf(
"[%s] invalid type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
594 stype, name, key, rc, type);
598 have = freerdp_settings_set_value_for_name(settings, name, value);
601 printf(
"[%s] have[%s] != expect[%s]\n", stype, have ?
"TRUE" :
"FALSE",
602 expect ?
"TRUE" :
"FALSE");
606 }
while (test_rounds-- > 0);
611 return log_result(res, __func__);
614static BOOL check_args(
const RDPDR_DEVICE* what,
size_t count,
const char* args[])
620 if (strcmp(what->Name, args[0]) != 0)
626 case RDPDR_DTYP_PRINT:
633 return strcmp(a->DriverName, args[1]) == 0;
636 case RDPDR_DTYP_SERIAL:
644 if (strcmp(a->Path, args[1]) != 0)
652 if (strcmp(a->Driver, args[2]) != 0)
660 if (strcmp(a->Permissive, args[3]) != 0)
666 case RDPDR_DTYP_PARALLEL:
673 return strcmp(a->Path, args[1]) == 0;
676 case RDPDR_DTYP_SMARTCARD:
679 case RDPDR_DTYP_FILESYSTEM:
686 if (strcmp(a->Path, args[1]) != 0)
691 return a->automount == (args[2] == NULL) ? TRUE : FALSE;
694 return !a->automount;
702static int check_device_type_arg(UINT32 Type,
size_t count,
const char* args[])
705 RDPDR_DEVICE* device = freerdp_device_new(Type, count, args);
716 if (!check_args(device, count, args))
720 if (!freerdp_device_equal(clone, device))
725 freerdp_device_free(device);
726 freerdp_device_free(clone);
727 return log_result(rc, __func__);
730static BOOL check_device_type(
void)
739 const char* args[] = {
"somename",
"anothername",
"3rdname",
"4thname" };
740 const struct test_entry tests[] = {
741 { 1, RDPDR_DTYP_SERIAL, 0, NULL },
742 { 1, RDPDR_DTYP_SERIAL, 0, args },
743 { 1, RDPDR_DTYP_SERIAL, 1, args },
744 { 1, RDPDR_DTYP_SERIAL, 2, args },
745 { 1, RDPDR_DTYP_SERIAL, 3, args },
746 { 1, RDPDR_DTYP_SERIAL, 4, args },
747 { 1, RDPDR_DTYP_PARALLEL, 0, NULL },
748 { 1, RDPDR_DTYP_PARALLEL, 0, args },
749 { 1, RDPDR_DTYP_PARALLEL, 1, args },
750 { 1, RDPDR_DTYP_PARALLEL, 2, args },
751 { 1, RDPDR_DTYP_PARALLEL, 3, args },
752 { 1, RDPDR_DTYP_PARALLEL, 4, args },
753 { 1, RDPDR_DTYP_PRINT, 0, NULL },
754 { 1, RDPDR_DTYP_PRINT, 0, args },
755 { 1, RDPDR_DTYP_PRINT, 1, args },
756 { 1, RDPDR_DTYP_PRINT, 2, args },
757 { 1, RDPDR_DTYP_PRINT, 3, args },
758 { 1, RDPDR_DTYP_PRINT, 4, args },
759 { 1, RDPDR_DTYP_FILESYSTEM, 0, NULL },
760 { 1, RDPDR_DTYP_FILESYSTEM, 0, args },
761 { 1, RDPDR_DTYP_FILESYSTEM, 1, args },
762 { 1, RDPDR_DTYP_FILESYSTEM, 2, args },
763 { 1, RDPDR_DTYP_FILESYSTEM, 3, args },
764 { 1, RDPDR_DTYP_FILESYSTEM, 4, args },
765 { 1, RDPDR_DTYP_SMARTCARD, 0, NULL },
766 { 1, RDPDR_DTYP_SMARTCARD, 0, args },
767 { 1, RDPDR_DTYP_SMARTCARD, 1, args },
768 { 1, RDPDR_DTYP_SMARTCARD, 2, args },
769 { 1, RDPDR_DTYP_SMARTCARD, 3, args },
770 { 1, RDPDR_DTYP_SMARTCARD, 4, args },
771 { -3, 0x123, 0, NULL },
772 { -3, 0x123, 0, args },
773 { -3, 0x123, 1, args },
774 { -3, 0x123, 2, args },
775 { -3, 0x123, 3, args },
776 { -3, 0x123, 4, args },
779 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
781 const struct test_entry* cur = &tests[x];
782 int got = check_device_type_arg(cur->type, cur->count, cur->args);
783 if (got != cur->expect)
786 return log_result(rc, __func__);
789static BOOL check_offsets(rdpSettings* settings,
size_t id,
size_t min,
size_t max, BOOL checkPtr)
793 WINPR_ASSERT(settings);
798 for (
size_t x = min; x < max; x++)
800 const void* ptr = freerdp_settings_get_pointer_array(settings,
id, x);
801 if (!ptr && checkPtr)
804 return log_result(rc, __func__);
807static BOOL test_write_offsets(rdpSettings* settings,
size_t id,
size_t elementSize,
size_t min,
810 WINPR_ASSERT(settings);
812 for (
size_t x = min; x < max; x++)
814 const void* ptr = NULL;
815 char buffer[8192] = { 0 };
817 winpr_RAND(buffer,
sizeof(buffer));
818 if (!freerdp_settings_set_pointer_array(settings,
id, x, buffer))
820 ptr = freerdp_settings_get_pointer_array(settings,
id, x);
823 if (memcmp(ptr, buffer, elementSize) != 0)
829static BOOL test_pointer_array(
void)
831 struct pointer_test_case
840 const struct pointer_test_case tests[] = {
841 { FALSE, FALSE, FreeRDP_DeviceArray, FreeRDP_DeviceArraySize, 32,
sizeof(
RDPDR_DEVICE*) },
842 { FALSE, FALSE, FreeRDP_StaticChannelArray, FreeRDP_StaticChannelArraySize, 32,
844 { FALSE, FALSE, FreeRDP_DynamicChannelArray, FreeRDP_DynamicChannelArraySize, 33,
846 { TRUE, TRUE, FreeRDP_BitmapCacheV2CellInfo, FreeRDP_BitmapCacheV2NumCells, 5,
848 { FALSE, FALSE, FreeRDP_OrderSupport, -1, 32,
sizeof(BYTE) },
849 { FALSE, FALSE, FreeRDP_ReceivedCapabilities, -1, 32,
sizeof(BYTE) },
852 { TRUE, TRUE, FreeRDP_MonitorIds, FreeRDP_NumMonitorIds, 33,
sizeof(UINT32) },
853 { TRUE, TRUE, FreeRDP_ChannelDefArray, FreeRDP_ChannelDefArraySize, 42,
855 { TRUE, TRUE, FreeRDP_MonitorDefArray, FreeRDP_MonitorDefArraySize, 33,
858 { FALSE, FALSE, FreeRDP_RdpServerCertificate, -1, 1,
sizeof(rdpCertificate*) },
860 { TRUE, TRUE, FreeRDP_RedirectionPassword, FreeRDP_RedirectionPasswordLength, 42,
862 { TRUE, TRUE, FreeRDP_RedirectionTsvUrl, FreeRDP_RedirectionTsvUrlLength, 42,
864 { TRUE, TRUE, FreeRDP_LoadBalanceInfo, FreeRDP_LoadBalanceInfoLength, 42,
sizeof(char) },
865 { TRUE, TRUE, FreeRDP_ServerRandom, FreeRDP_ServerRandomLength, 42,
sizeof(char) },
866 { TRUE, TRUE, FreeRDP_ClientRandom, FreeRDP_ClientRandomLength, 42,
sizeof(char) },
867 { TRUE, TRUE, FreeRDP_ServerCertificate, FreeRDP_ServerCertificateLength, 42,
877 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
879 const struct pointer_test_case* cur = &tests[x];
882 if (cur->sizeId >= 0)
888 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
890 if (check_offsets(settings, cur->id, cur->size, cur->size + 5, TRUE))
894 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
896 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
901 if (cur->sizeId >= 0)
907 if (check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
911 if (test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
916 if (cur->sizeId >= 0)
922 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
924 if (check_offsets(settings, cur->id, cur->size + 1, cur->size + 5, TRUE))
928 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
930 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
939 return log_result(rc, __func__);
942struct validity_test_case
949static BOOL prepare_monitor_array(rdpSettings* settings,
const struct validity_test_case* testcase)
951 WINPR_ASSERT(settings);
952 WINPR_ASSERT(testcase);
958static BOOL check_primary_offset(
const rdpSettings* settings,
const rdpMonitor* monitors,
962 for (
size_t x = 0; x < count; x++)
970 for (
size_t x = 0; x < count; x++)
973 if ((cur->x == 0) && (cur->y == 0))
978 for (
size_t x = 0; x < count; x++)
981 freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorDefArray, x);
988 if (!sprimary || !cprimary)
991 const INT32 xoff = cprimary->x;
992 const INT32 yoff = cprimary->y;
1002static BOOL test_validity_check(
void)
1016 .attributes = { .physicalWidth = 100,
1017 .physicalHeight = 100,
1018 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1019 .desktopScaleFactor = 100,
1020 .deviceScaleFactor = 100 } }
1022 const rdpMonitor single_monitor_invalid_1[] = {
1029 .attributes = { .physicalWidth = 100,
1030 .physicalHeight = 100,
1031 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1032 .desktopScaleFactor = 100,
1033 .deviceScaleFactor = 100 } }
1035 const rdpMonitor single_monitor_invalid_2[] = {
1042 .attributes = { .physicalWidth = 100,
1043 .physicalHeight = 100,
1044 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1045 .desktopScaleFactor = 100,
1046 .deviceScaleFactor = 100 } }
1048 const rdpMonitor single_monitor_invalid_3[] = {
1055 .attributes = { .physicalWidth = 100,
1056 .physicalHeight = 100,
1057 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1058 .desktopScaleFactor = 100,
1059 .deviceScaleFactor = 100 } }
1061 const rdpMonitor single_monitor_invalid_4[] = {
1068 .attributes = { .physicalWidth = 100,
1069 .physicalHeight = 100,
1070 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1071 .desktopScaleFactor = 100,
1072 .deviceScaleFactor = 100 } }
1079 .is_primary = FALSE,
1081 .attributes = { .physicalWidth = 100,
1082 .physicalHeight = 100,
1083 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1084 .desktopScaleFactor = 100,
1085 .deviceScaleFactor = 100 } },
1090 .is_primary = FALSE,
1092 .attributes = { .physicalWidth = 100,
1093 .physicalHeight = 100,
1094 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1095 .desktopScaleFactor = 100,
1096 .deviceScaleFactor = 100 } },
1101 .is_primary = FALSE,
1103 .attributes = { .physicalWidth = 100,
1104 .physicalHeight = 100,
1105 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1106 .desktopScaleFactor = 100,
1107 .deviceScaleFactor = 100 } },
1112 .is_primary = FALSE,
1114 .attributes = { .physicalWidth = 100,
1115 .physicalHeight = 100,
1116 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1117 .desktopScaleFactor = 100,
1118 .deviceScaleFactor = 100 } },
1125 .attributes = { .physicalWidth = 100,
1126 .physicalHeight = 100,
1127 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1128 .desktopScaleFactor = 100,
1129 .deviceScaleFactor = 100 } },
1134 .is_primary = FALSE,
1136 .attributes = { .physicalWidth = 100,
1137 .physicalHeight = 100,
1138 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1139 .desktopScaleFactor = 100,
1140 .deviceScaleFactor = 100 } },
1145 .is_primary = FALSE,
1147 .attributes = { .physicalWidth = 100,
1148 .physicalHeight = 100,
1149 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1150 .desktopScaleFactor = 100,
1151 .deviceScaleFactor = 100 } },
1156 .is_primary = FALSE,
1158 .attributes = { .physicalWidth = 100,
1159 .physicalHeight = 100,
1160 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1161 .desktopScaleFactor = 100,
1162 .deviceScaleFactor = 100 } },
1167 .is_primary = FALSE,
1169 .attributes = { .physicalWidth = 100,
1170 .physicalHeight = 100,
1171 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1172 .desktopScaleFactor = 100,
1173 .deviceScaleFactor = 100 } },
1178 .is_primary = FALSE,
1180 .attributes = { .physicalWidth = 100,
1181 .physicalHeight = 100,
1182 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1183 .desktopScaleFactor = 100,
1184 .deviceScaleFactor = 100 } },
1189 .is_primary = FALSE,
1191 .attributes = { .physicalWidth = 100,
1192 .physicalHeight = 100,
1193 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1194 .desktopScaleFactor = 100,
1195 .deviceScaleFactor = 100 } },
1200 .is_primary = FALSE,
1202 .attributes = { .physicalWidth = 100,
1203 .physicalHeight = 100,
1204 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1205 .desktopScaleFactor = 100,
1206 .deviceScaleFactor = 100 } },
1208 const rdpMonitor multi_monitor_invalid_1[] = {
1213 .is_primary = FALSE,
1215 .attributes = { .physicalWidth = 100,
1216 .physicalHeight = 100,
1217 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1218 .desktopScaleFactor = 100,
1219 .deviceScaleFactor = 100 } },
1224 .is_primary = FALSE,
1226 .attributes = { .physicalWidth = 100,
1227 .physicalHeight = 100,
1228 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1229 .desktopScaleFactor = 100,
1230 .deviceScaleFactor = 100 } }
1232 const rdpMonitor multi_monitor_invalid_2[] = {
1237 .is_primary = FALSE,
1239 .attributes = { .physicalWidth = 100,
1240 .physicalHeight = 100,
1241 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1242 .desktopScaleFactor = 100,
1243 .deviceScaleFactor = 100 } },
1250 .attributes = { .physicalWidth = 100,
1251 .physicalHeight = 100,
1252 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1253 .desktopScaleFactor = 100,
1254 .deviceScaleFactor = 100 } }
1256 const rdpMonitor multi_monitor_invalid_3[] = {
1261 .is_primary = FALSE,
1263 .attributes = { .physicalWidth = 100,
1264 .physicalHeight = 100,
1265 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1266 .desktopScaleFactor = 100,
1267 .deviceScaleFactor = 100 } },
1274 .attributes = { .physicalWidth = 100,
1275 .physicalHeight = 100,
1276 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1277 .desktopScaleFactor = 100,
1278 .deviceScaleFactor = 100 } }
1280 const rdpMonitor multi_monitor_invalid_4[] = {
1285 .is_primary = FALSE,
1287 .attributes = { .physicalWidth = 100,
1288 .physicalHeight = 100,
1289 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1290 .desktopScaleFactor = 100,
1291 .deviceScaleFactor = 100 } },
1298 .attributes = { .physicalWidth = 100,
1299 .physicalHeight = 100,
1300 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1301 .desktopScaleFactor = 100,
1302 .deviceScaleFactor = 100 } }
1312 .attributes = { .physicalWidth = 100,
1313 .physicalHeight = 100,
1314 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1315 .desktopScaleFactor = 100,
1316 .deviceScaleFactor = 100 } },
1321 .is_primary = FALSE,
1323 .attributes = { .physicalWidth = 100,
1324 .physicalHeight = 100,
1325 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1326 .desktopScaleFactor = 100,
1327 .deviceScaleFactor = 100 } },
1332 .is_primary = FALSE,
1334 .attributes = { .physicalWidth = 100,
1335 .physicalHeight = 100,
1336 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1337 .desktopScaleFactor = 100,
1338 .deviceScaleFactor = 100 } }
1348 .attributes = { .physicalWidth = 100,
1349 .physicalHeight = 100,
1350 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1351 .desktopScaleFactor = 100,
1352 .deviceScaleFactor = 100 } },
1357 .is_primary = FALSE,
1359 .attributes = { .physicalWidth = 100,
1360 .physicalHeight = 100,
1361 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1362 .desktopScaleFactor = 100,
1363 .deviceScaleFactor = 100 } },
1368 .is_primary = FALSE,
1370 .attributes = { .physicalWidth = 100,
1371 .physicalHeight = 100,
1372 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1373 .desktopScaleFactor = 100,
1374 .deviceScaleFactor = 100 } }
1377 const struct validity_test_case tests[] = {
1378 { TRUE, ARRAYSIZE(single_monitor_valid), single_monitor_valid },
1379 { FALSE, ARRAYSIZE(single_monitor_invalid_1), single_monitor_invalid_1 },
1380 { FALSE, ARRAYSIZE(single_monitor_invalid_2), single_monitor_invalid_2 },
1381 { FALSE, ARRAYSIZE(single_monitor_invalid_3), single_monitor_invalid_3 },
1382 { FALSE, ARRAYSIZE(single_monitor_invalid_4), single_monitor_invalid_4 },
1383 { TRUE, ARRAYSIZE(multi_monitor_valid), multi_monitor_valid },
1384 { TRUE, ARRAYSIZE(multi_monitor_invalid_1), multi_monitor_invalid_1 },
1385 { FALSE, ARRAYSIZE(multi_monitor_invalid_2), multi_monitor_invalid_2 },
1386 { FALSE, ARRAYSIZE(multi_monitor_invalid_3), multi_monitor_invalid_3 },
1387 { FALSE, ARRAYSIZE(multi_monitor_invalid_4), multi_monitor_invalid_4 },
1388 { TRUE, ARRAYSIZE(multi_monitor_valid_2), multi_monitor_valid_2 },
1389 { TRUE, ARRAYSIZE(multi_monitor_valid_3), multi_monitor_valid_3 }
1393 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
1395 const struct validity_test_case* cur = &tests[x];
1397 if (!prepare_monitor_array(settings, cur))
1398 rc = log_result_case(FALSE, __func__, x);
1401#if defined(BUILD_TESTING_INTERNAL)
1402 const BOOL res = freerdp_settings_check_client_after_preconnect(settings);
1404 const BOOL res = cur->expected;
1407 if ((res != cur->expected) ||
1408 !check_primary_offset(settings, cur->monitors, cur->count))
1410 rc = log_result_case(FALSE, __func__, x);
1417 return log_result(rc, __func__);
1420static BOOL test_string_null(rdpSettings* settings, FreeRDP_Settings_Keys_String
id)
1426 return (chk == NULL);
1429static BOOL test_string_check(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1430 const char*
string,
size_t len)
1436 const size_t clen = strnlen(chk, len + 1);
1443 if (strncmp(
string, chk, clen) != 0)
1449static BOOL test_string_check_reset(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1450 const char*
string,
size_t len)
1452 return test_string_check(settings,
id,
string, len) && test_string_null(settings,
id);
1455static BOOL test_string_set_readback(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1456 const char*
string,
size_t len)
1458 WINPR_ASSERT(len > 3);
1463 const size_t slen = strnlen(
string, len);
1467 if (!test_string_check_reset(settings,
id,
string, slen - 1))
1475 if (!wstr || (wlen != slen))
1478 if (!test_string_check_reset(settings,
id,
string, slen))
1484 if (!test_string_check(settings,
id,
string, slen - 1))
1490 if (!test_string_check(settings,
id,
string, slen))
1499static BOOL test_string_len(rdpSettings* settings)
1503 const char user[] =
"abcdefg";
1504 if (!test_string_set_readback(settings, FreeRDP_Username, user,
sizeof(user)))
1507 const char pwd[] =
"xyz";
1508 if (!test_string_set_readback(settings, FreeRDP_Password, pwd,
sizeof(pwd)))
1511 const char domain[] =
"foobar";
1512 if (!test_string_set_readback(settings, FreeRDP_Domain, domain,
sizeof(domain)))
1520int TestSettings(
int argc,
char* argv[])
1523 rdpSettings* settings = NULL;
1524 rdpSettings* cloned = NULL;
1525 rdpSettings* cloned2 = NULL;
1529 if (!test_dyn_channels())
1531 if (!test_static_channels())
1535 if (!test_helpers())
1537 if (!check_device_type())
1539 if (!test_pointer_array())
1541 if (!test_validity_check())
1548 printf(
"Couldn't create settings\n");
1552 if (!test_string_len(settings))
1560#if defined(have_bool_list_indices)
1562 for (
size_t x = 0; x < ARRAYSIZE(bool_list_indices); x++)
1564 const size_t key = bool_list_indices[x];
1571 printf(
"mismatch for key %s: %u -> copy %u\n", name, val, cval);
1576 if (!check_key_helpers(key,
"bool"))
1581#if defined(have_int16_list_indices)
1583 for (
size_t x = 0; x < ARRAYSIZE(int16_list_indices); x++)
1585 const size_t key = int16_list_indices[x];
1591 printf(
"mismatch for key %s: %" PRId16
" -> copy %" PRId16
"\n", name, val, cval);
1596 if (!check_key_helpers(key,
"int16"))
1601#if defined(have_uint16_list_indices)
1603 for (
size_t x = 0; x < ARRAYSIZE(uint16_list_indices); x++)
1605 const size_t key = uint16_list_indices[x];
1612 printf(
"mismatch for key %s: %" PRIu16
" -> copy %" PRIu16
"\n", name, val, cval);
1617 if (!check_key_helpers(key,
"uint16"))
1622#if defined(have_uint32_list_indices)
1624 for (
size_t x = 0; x < ARRAYSIZE(uint32_list_indices); x++)
1626 const size_t key = uint32_list_indices[x];
1633 printf(
"mismatch for key %s: %" PRIu32
" -> copy %" PRIu32
"\n", name, val, cval);
1638 if (!check_key_helpers(key,
"uint32"))
1643#if defined(have_int32_list_indices)
1645 for (
size_t x = 0; x < ARRAYSIZE(int32_list_indices); x++)
1647 const size_t key = int32_list_indices[x];
1654 printf(
"mismatch for key %s: %" PRId32
" -> copy %" PRId32
"\n", name, val, cval);
1659 if (!check_key_helpers(key,
"int32"))
1664#if defined(have_uint64_list_indices)
1666 for (
size_t x = 0; x < ARRAYSIZE(uint64_list_indices); x++)
1668 const size_t key = uint64_list_indices[x];
1675 printf(
"mismatch for key %s: %" PRIu64
" -> copy %" PRIu64
"\n", name, val, cval);
1680 if (!check_key_helpers(key,
"uint64"))
1685#if defined(have_int64_list_indices)
1687 for (
size_t x = 0; x < ARRAYSIZE(int64_list_indices); x++)
1689 const size_t key = int64_list_indices[x];
1695 printf(
"mismatch for key %s: %" PRId64
" -> copy %" PRId64
"\n", name, val, cval);
1700 if (!check_key_helpers(key,
"int64"))
1705#if defined(have_string_list_indices)
1707 for (
size_t x = 0; x < ARRAYSIZE(string_list_indices); x++)
1709 const size_t key = string_list_indices[x];
1710 const char val[] =
"test-string";
1711 const char* res = NULL;
1716 if ((oval != cval) && (strcmp(oval, cval) != 0))
1718 printf(
"mismatch for key %s: %s -> copy %s\n", name, oval, cval);
1726 if (strncmp(val, res,
sizeof(val)) != 0)
1731#if defined(have_pointer_list_indices)
1733 for (
size_t x = 0; x < ARRAYSIZE(pointer_list_indices); x++)
1735 const size_t key = pointer_list_indices[x];
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 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.
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 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 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.