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 [");
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 [");
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 = NULL;
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, NULL, 0) failed\n", stype, foo);
567 UINT16 intEntryType = 0;
570 char value[8192] = { 0 };
582 winpr_RAND(&intEntryType,
sizeof(intEntryType));
583 winpr_RAND(&val.u64,
sizeof(val.u64));
587 case FreeRDP_ReceivedCapabilitiesSize:
588 case FreeRDP_TargetNetAddressCount:
597 case RDP_SETTINGS_TYPE_BOOL:
598 expect = format_bool(value,
sizeof(value), intEntryType);
600 case RDP_SETTINGS_TYPE_UINT16:
601 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT16_MAX);
603 case RDP_SETTINGS_TYPE_INT16:
605 format_int(value,
sizeof(value), val.i64, intEntryType, INT16_MAX, INT16_MIN);
607 case RDP_SETTINGS_TYPE_UINT32:
608 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT32_MAX);
610 case RDP_SETTINGS_TYPE_INT32:
612 format_int(value,
sizeof(value), val.i64, intEntryType, INT32_MAX, INT32_MIN);
614 case RDP_SETTINGS_TYPE_UINT64:
615 expect = format_uint(value,
sizeof(value), val.u64, intEntryType, UINT64_MAX);
617 case RDP_SETTINGS_TYPE_INT64:
619 format_int(value,
sizeof(value), val.i64, intEntryType, INT64_MAX, INT64_MIN);
621 case RDP_SETTINGS_TYPE_STRING:
623 (void)_snprintf(value,
sizeof(value),
"somerandomstring");
625 case RDP_SETTINGS_TYPE_POINTER:
630 printf(
"[%s] invalid type for key %s [%" PRIuz
"]: %" PRIdz
" <--> %" PRIdz
"\n",
631 stype, name, key, rc, type);
635 have = freerdp_settings_set_value_for_name(settings, name, value);
638 printf(
"[%s] %s=%s have [%s] != expect[%s]\n", stype, name, value,
639 have ?
"TRUE" :
"FALSE", expect ?
"TRUE" :
"FALSE");
643 }
while (test_rounds-- > 0);
648 return log_result(res);
651static BOOL check_args(
const RDPDR_DEVICE* what,
size_t count,
const char* args[])
657 if (strcmp(what->Name, args[0]) != 0)
663 case RDPDR_DTYP_PRINT:
670 return strcmp(a->DriverName, args[1]) == 0;
673 case RDPDR_DTYP_SERIAL:
681 if (strcmp(a->Path, args[1]) != 0)
689 if (strcmp(a->Driver, args[2]) != 0)
697 if (strcmp(a->Permissive, args[3]) != 0)
703 case RDPDR_DTYP_PARALLEL:
710 return strcmp(a->Path, args[1]) == 0;
713 case RDPDR_DTYP_SMARTCARD:
716 case RDPDR_DTYP_FILESYSTEM:
723 if (strcmp(a->Path, args[1]) != 0)
728 return a->automount == (args[2] == NULL) ? TRUE : FALSE;
731 return !a->automount;
739static int check_device_type_arg(UINT32 Type,
size_t count,
const char* args[])
742 RDPDR_DEVICE* device = freerdp_device_new(Type, count, args);
753 if (!check_args(device, count, args))
757 if (!freerdp_device_equal(clone, device))
762 freerdp_device_free(device);
763 freerdp_device_free(clone);
764 return log_result(rc);
767static BOOL check_device_type(
void)
777 const char* args[] = {
"somename",
"anothername",
"3rdname",
"4thname" };
778 const struct test_entry tests[] = {
779 { 1, RDPDR_DTYP_SERIAL, 0, NULL },
780 { 1, RDPDR_DTYP_SERIAL, 0, args },
781 { 1, RDPDR_DTYP_SERIAL, 1, args },
782 { 1, RDPDR_DTYP_SERIAL, 2, args },
783 { 1, RDPDR_DTYP_SERIAL, 3, args },
784 { 1, RDPDR_DTYP_SERIAL, 4, args },
785 { 1, RDPDR_DTYP_PARALLEL, 0, NULL },
786 { 1, RDPDR_DTYP_PARALLEL, 0, args },
787 { 1, RDPDR_DTYP_PARALLEL, 1, args },
788 { 1, RDPDR_DTYP_PARALLEL, 2, args },
789 { 1, RDPDR_DTYP_PARALLEL, 3, args },
790 { 1, RDPDR_DTYP_PARALLEL, 4, args },
791 { 1, RDPDR_DTYP_PRINT, 0, NULL },
792 { 1, RDPDR_DTYP_PRINT, 0, args },
793 { 1, RDPDR_DTYP_PRINT, 1, args },
794 { 1, RDPDR_DTYP_PRINT, 2, args },
795 { 1, RDPDR_DTYP_PRINT, 3, args },
796 { 1, RDPDR_DTYP_PRINT, 4, args },
797 { 1, RDPDR_DTYP_FILESYSTEM, 0, NULL },
798 { 1, RDPDR_DTYP_FILESYSTEM, 0, args },
799 { 1, RDPDR_DTYP_FILESYSTEM, 1, args },
800 { 1, RDPDR_DTYP_FILESYSTEM, 2, args },
801 { 1, RDPDR_DTYP_FILESYSTEM, 3, args },
802 { 1, RDPDR_DTYP_FILESYSTEM, 4, args },
803 { 1, RDPDR_DTYP_SMARTCARD, 0, NULL },
804 { 1, RDPDR_DTYP_SMARTCARD, 0, args },
805 { 1, RDPDR_DTYP_SMARTCARD, 1, args },
806 { 1, RDPDR_DTYP_SMARTCARD, 2, args },
807 { 1, RDPDR_DTYP_SMARTCARD, 3, args },
808 { 1, RDPDR_DTYP_SMARTCARD, 4, args },
809 { -3, 0x123, 0, NULL },
810 { -3, 0x123, 0, args },
811 { -3, 0x123, 1, args },
812 { -3, 0x123, 2, args },
813 { -3, 0x123, 3, args },
814 { -3, 0x123, 4, args },
817 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
819 const struct test_entry* cur = &tests[x];
820 int got = check_device_type_arg(cur->type, cur->count, cur->args);
821 if (got != cur->expect)
824 return log_result(rc);
827static BOOL check_offsets(rdpSettings* settings,
size_t id,
size_t min,
size_t max, BOOL checkPtr)
831 WINPR_ASSERT(settings);
836 for (
size_t x = min; x < max; x++)
838 const void* ptr = freerdp_settings_get_pointer_array(settings,
id, x);
839 if (!ptr && checkPtr)
842 return log_result(rc);
845static BOOL test_write_offsets(rdpSettings* settings,
size_t id,
size_t elementSize,
size_t min,
848 WINPR_ASSERT(settings);
850 for (
size_t x = min; x < max; x++)
852 const void* ptr = NULL;
853 char buffer[8192] = { 0 };
855 winpr_RAND(buffer,
sizeof(buffer));
856 if (!freerdp_settings_set_pointer_array(settings,
id, x, buffer))
858 ptr = freerdp_settings_get_pointer_array(settings,
id, x);
861 if (memcmp(ptr, buffer, elementSize) != 0)
867static BOOL test_pointer_array(
void)
869 struct pointer_test_case
878 const struct pointer_test_case tests[] = {
879 { FALSE, FALSE, FreeRDP_DeviceArray, FreeRDP_DeviceArraySize, 32,
sizeof(
RDPDR_DEVICE*) },
880 { FALSE, FALSE, FreeRDP_StaticChannelArray, FreeRDP_StaticChannelArraySize, 32,
882 { FALSE, FALSE, FreeRDP_DynamicChannelArray, FreeRDP_DynamicChannelArraySize, 33,
884 { TRUE, TRUE, FreeRDP_BitmapCacheV2CellInfo, FreeRDP_BitmapCacheV2NumCells, 5,
886 { FALSE, FALSE, FreeRDP_OrderSupport, -1, 32,
sizeof(BYTE) },
887 { FALSE, FALSE, FreeRDP_ReceivedCapabilities, -1, 32,
sizeof(BYTE) },
890 { TRUE, TRUE, FreeRDP_MonitorIds, FreeRDP_NumMonitorIds, 33,
sizeof(UINT32) },
891 { TRUE, TRUE, FreeRDP_ChannelDefArray, FreeRDP_ChannelDefArraySize, 42,
893 { TRUE, TRUE, FreeRDP_MonitorDefArray, FreeRDP_MonitorDefArraySize, 33,
896 { FALSE, FALSE, FreeRDP_RdpServerCertificate, -1, 1,
sizeof(rdpCertificate*) },
898 { TRUE, TRUE, FreeRDP_RedirectionPassword, FreeRDP_RedirectionPasswordLength, 42,
900 { TRUE, TRUE, FreeRDP_RedirectionTsvUrl, FreeRDP_RedirectionTsvUrlLength, 42,
902 { TRUE, TRUE, FreeRDP_LoadBalanceInfo, FreeRDP_LoadBalanceInfoLength, 42,
sizeof(char) },
903 { TRUE, TRUE, FreeRDP_ServerRandom, FreeRDP_ServerRandomLength, 42,
sizeof(char) },
904 { TRUE, TRUE, FreeRDP_ClientRandom, FreeRDP_ClientRandomLength, 42,
sizeof(char) },
905 { TRUE, TRUE, FreeRDP_ServerCertificate, FreeRDP_ServerCertificateLength, 42,
915 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
917 const struct pointer_test_case* cur = &tests[x];
920 if (cur->sizeId >= 0)
926 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
928 if (check_offsets(settings, cur->id, cur->size, cur->size + 5, TRUE))
932 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
934 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
939 if (cur->sizeId >= 0)
945 if (check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
949 if (test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
954 if (cur->sizeId >= 0)
960 if (!check_offsets(settings, cur->id, 0, cur->size, cur->checkPtr))
962 if (check_offsets(settings, cur->id, cur->size + 1, cur->size + 5, TRUE))
966 if (!test_write_offsets(settings, cur->id, cur->elementSize, 0, cur->size))
968 if (test_write_offsets(settings, cur->id, cur->elementSize, cur->size, cur->size + 5))
977 return log_result(rc);
980struct validity_test_case
987static BOOL prepare_monitor_array(rdpSettings* settings,
const struct validity_test_case* testcase)
989 WINPR_ASSERT(settings);
990 WINPR_ASSERT(testcase);
996static BOOL check_primary_offset(
const rdpSettings* settings,
const rdpMonitor* monitors,
1000 for (
size_t x = 0; x < count; x++)
1003 if (cur->is_primary)
1008 for (
size_t x = 0; x < count; x++)
1011 if ((cur->x == 0) && (cur->y == 0))
1016 for (
size_t x = 0; x < count; x++)
1019 freerdp_settings_get_pointer_array(settings, FreeRDP_MonitorDefArray, x);
1022 if (cur->is_primary)
1026 if (!sprimary || !cprimary)
1029 const INT32 xoff = cprimary->x;
1030 const INT32 yoff = cprimary->y;
1040static BOOL test_validity_check(
void)
1055 .attributes = { .physicalWidth = 100,
1056 .physicalHeight = 100,
1057 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1058 .desktopScaleFactor = 100,
1059 .deviceScaleFactor = 100 } }
1061 const rdpMonitor single_monitor_invalid_1[] = {
1068 .attributes = { .physicalWidth = 100,
1069 .physicalHeight = 100,
1070 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1071 .desktopScaleFactor = 100,
1072 .deviceScaleFactor = 100 } }
1074 const rdpMonitor single_monitor_invalid_2[] = {
1081 .attributes = { .physicalWidth = 100,
1082 .physicalHeight = 100,
1083 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1084 .desktopScaleFactor = 100,
1085 .deviceScaleFactor = 100 } }
1087 const rdpMonitor single_monitor_invalid_3[] = {
1094 .attributes = { .physicalWidth = 100,
1095 .physicalHeight = 100,
1096 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1097 .desktopScaleFactor = 100,
1098 .deviceScaleFactor = 100 } }
1100 const rdpMonitor single_monitor_invalid_4[] = {
1107 .attributes = { .physicalWidth = 100,
1108 .physicalHeight = 100,
1109 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1110 .desktopScaleFactor = 100,
1111 .deviceScaleFactor = 100 } }
1118 .is_primary = FALSE,
1120 .attributes = { .physicalWidth = 100,
1121 .physicalHeight = 100,
1122 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1123 .desktopScaleFactor = 100,
1124 .deviceScaleFactor = 100 } },
1129 .is_primary = FALSE,
1131 .attributes = { .physicalWidth = 100,
1132 .physicalHeight = 100,
1133 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1134 .desktopScaleFactor = 100,
1135 .deviceScaleFactor = 100 } },
1140 .is_primary = FALSE,
1142 .attributes = { .physicalWidth = 100,
1143 .physicalHeight = 100,
1144 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1145 .desktopScaleFactor = 100,
1146 .deviceScaleFactor = 100 } },
1151 .is_primary = FALSE,
1153 .attributes = { .physicalWidth = 100,
1154 .physicalHeight = 100,
1155 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1156 .desktopScaleFactor = 100,
1157 .deviceScaleFactor = 100 } },
1164 .attributes = { .physicalWidth = 100,
1165 .physicalHeight = 100,
1166 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1167 .desktopScaleFactor = 100,
1168 .deviceScaleFactor = 100 } },
1173 .is_primary = FALSE,
1175 .attributes = { .physicalWidth = 100,
1176 .physicalHeight = 100,
1177 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1178 .desktopScaleFactor = 100,
1179 .deviceScaleFactor = 100 } },
1184 .is_primary = FALSE,
1186 .attributes = { .physicalWidth = 100,
1187 .physicalHeight = 100,
1188 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1189 .desktopScaleFactor = 100,
1190 .deviceScaleFactor = 100 } },
1195 .is_primary = FALSE,
1197 .attributes = { .physicalWidth = 100,
1198 .physicalHeight = 100,
1199 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1200 .desktopScaleFactor = 100,
1201 .deviceScaleFactor = 100 } },
1206 .is_primary = FALSE,
1208 .attributes = { .physicalWidth = 100,
1209 .physicalHeight = 100,
1210 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1211 .desktopScaleFactor = 100,
1212 .deviceScaleFactor = 100 } },
1217 .is_primary = FALSE,
1219 .attributes = { .physicalWidth = 100,
1220 .physicalHeight = 100,
1221 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1222 .desktopScaleFactor = 100,
1223 .deviceScaleFactor = 100 } },
1228 .is_primary = FALSE,
1230 .attributes = { .physicalWidth = 100,
1231 .physicalHeight = 100,
1232 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1233 .desktopScaleFactor = 100,
1234 .deviceScaleFactor = 100 } },
1239 .is_primary = FALSE,
1241 .attributes = { .physicalWidth = 100,
1242 .physicalHeight = 100,
1243 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1244 .desktopScaleFactor = 100,
1245 .deviceScaleFactor = 100 } },
1247 const rdpMonitor multi_monitor_invalid_1[] = {
1252 .is_primary = FALSE,
1254 .attributes = { .physicalWidth = 100,
1255 .physicalHeight = 100,
1256 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1257 .desktopScaleFactor = 100,
1258 .deviceScaleFactor = 100 } },
1263 .is_primary = FALSE,
1265 .attributes = { .physicalWidth = 100,
1266 .physicalHeight = 100,
1267 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1268 .desktopScaleFactor = 100,
1269 .deviceScaleFactor = 100 } }
1271 const rdpMonitor multi_monitor_invalid_2[] = {
1276 .is_primary = FALSE,
1278 .attributes = { .physicalWidth = 100,
1279 .physicalHeight = 100,
1280 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1281 .desktopScaleFactor = 100,
1282 .deviceScaleFactor = 100 } },
1289 .attributes = { .physicalWidth = 100,
1290 .physicalHeight = 100,
1291 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1292 .desktopScaleFactor = 100,
1293 .deviceScaleFactor = 100 } }
1295 const rdpMonitor multi_monitor_invalid_3[] = {
1300 .is_primary = FALSE,
1302 .attributes = { .physicalWidth = 100,
1303 .physicalHeight = 100,
1304 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1305 .desktopScaleFactor = 100,
1306 .deviceScaleFactor = 100 } },
1313 .attributes = { .physicalWidth = 100,
1314 .physicalHeight = 100,
1315 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1316 .desktopScaleFactor = 100,
1317 .deviceScaleFactor = 100 } }
1319 const rdpMonitor multi_monitor_invalid_4[] = {
1324 .is_primary = FALSE,
1326 .attributes = { .physicalWidth = 100,
1327 .physicalHeight = 100,
1328 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1329 .desktopScaleFactor = 100,
1330 .deviceScaleFactor = 100 } },
1337 .attributes = { .physicalWidth = 100,
1338 .physicalHeight = 100,
1339 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1340 .desktopScaleFactor = 100,
1341 .deviceScaleFactor = 100 } }
1351 .attributes = { .physicalWidth = 100,
1352 .physicalHeight = 100,
1353 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1354 .desktopScaleFactor = 100,
1355 .deviceScaleFactor = 100 } },
1360 .is_primary = FALSE,
1362 .attributes = { .physicalWidth = 100,
1363 .physicalHeight = 100,
1364 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1365 .desktopScaleFactor = 100,
1366 .deviceScaleFactor = 100 } },
1371 .is_primary = FALSE,
1373 .attributes = { .physicalWidth = 100,
1374 .physicalHeight = 100,
1375 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1376 .desktopScaleFactor = 100,
1377 .deviceScaleFactor = 100 } }
1387 .attributes = { .physicalWidth = 100,
1388 .physicalHeight = 100,
1389 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1390 .desktopScaleFactor = 100,
1391 .deviceScaleFactor = 100 } },
1396 .is_primary = FALSE,
1398 .attributes = { .physicalWidth = 100,
1399 .physicalHeight = 100,
1400 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1401 .desktopScaleFactor = 100,
1402 .deviceScaleFactor = 100 } },
1407 .is_primary = FALSE,
1409 .attributes = { .physicalWidth = 100,
1410 .physicalHeight = 100,
1411 .orientation = ORIENTATION_PREFERENCE_LANDSCAPE,
1412 .desktopScaleFactor = 100,
1413 .deviceScaleFactor = 100 } }
1416 const struct validity_test_case tests[] = {
1417 { TRUE, ARRAYSIZE(single_monitor_valid), single_monitor_valid },
1418 { FALSE, ARRAYSIZE(single_monitor_invalid_1), single_monitor_invalid_1 },
1419 { FALSE, ARRAYSIZE(single_monitor_invalid_2), single_monitor_invalid_2 },
1420 { FALSE, ARRAYSIZE(single_monitor_invalid_3), single_monitor_invalid_3 },
1421 { FALSE, ARRAYSIZE(single_monitor_invalid_4), single_monitor_invalid_4 },
1422 { TRUE, ARRAYSIZE(multi_monitor_valid), multi_monitor_valid },
1423 { TRUE, ARRAYSIZE(multi_monitor_invalid_1), multi_monitor_invalid_1 },
1424 { FALSE, ARRAYSIZE(multi_monitor_invalid_2), multi_monitor_invalid_2 },
1425 { FALSE, ARRAYSIZE(multi_monitor_invalid_3), multi_monitor_invalid_3 },
1426 { FALSE, ARRAYSIZE(multi_monitor_invalid_4), multi_monitor_invalid_4 },
1427 { TRUE, ARRAYSIZE(multi_monitor_valid_2), multi_monitor_valid_2 },
1428 { TRUE, ARRAYSIZE(multi_monitor_valid_3), multi_monitor_valid_3 }
1432 for (
size_t x = 0; x < ARRAYSIZE(tests); x++)
1434 const struct validity_test_case* cur = &tests[x];
1436 if (!prepare_monitor_array(settings, cur))
1437 rc = log_result_case(FALSE, __func__, x);
1440#if defined(BUILD_TESTING_INTERNAL)
1441 const BOOL res = freerdp_settings_check_client_after_preconnect(settings);
1443 const BOOL res = cur->expected;
1446 if ((res != cur->expected) ||
1447 !check_primary_offset(settings, cur->monitors, cur->count))
1449 rc = log_result_case(FALSE, __func__, x);
1456 return log_result(rc);
1459static BOOL test_string_null(rdpSettings* settings, FreeRDP_Settings_Keys_String
id)
1465 return (chk == NULL);
1468static BOOL test_string_check(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1469 const char*
string,
size_t len)
1475 const size_t clen = strnlen(chk, len + 1);
1482 if (strncmp(
string, chk, clen) != 0)
1488static BOOL test_string_check_reset(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1489 const char*
string,
size_t len)
1491 return test_string_check(settings,
id,
string, len) && test_string_null(settings,
id);
1494static BOOL test_string_set_readback(rdpSettings* settings, FreeRDP_Settings_Keys_String
id,
1495 const char*
string,
size_t len)
1497 WINPR_ASSERT(len > 3);
1502 const size_t slen = strnlen(
string, len);
1506 if (!test_string_check_reset(settings,
id,
string, slen - 1))
1514 if (!wstr || (wlen != slen))
1517 if (!test_string_check_reset(settings,
id,
string, slen))
1523 if (!test_string_check(settings,
id,
string, slen - 1))
1529 if (!test_string_check(settings,
id,
string, slen))
1538static BOOL test_string_len(rdpSettings* settings)
1542 const char user[] =
"abcdefg";
1543 if (!test_string_set_readback(settings, FreeRDP_Username, user,
sizeof(user)))
1546 const char pwd[] =
"xyz";
1547 if (!test_string_set_readback(settings, FreeRDP_Password, pwd,
sizeof(pwd)))
1550 const char domain[] =
"foobar";
1551 if (!test_string_set_readback(settings, FreeRDP_Domain, domain,
sizeof(domain)))
1559static BOOL test_serialize_with(rdpSettings* src,
const char* name)
1564 rdpSettings* dst = NULL;
1569 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_serialize");
1571 if (!str || (slen == 0))
1574 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_deserialize");
1579 log_start_(
"%s-%s-%s", name, __func__,
"freerdp_settings_print_diff");
1587 return log_result_(rc,
"%s-%s", name, __func__);
1590static BOOL test_serialize_strings(DWORD flags,
const char* str)
1597 for (
int x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++)
1602 FreeRDP_Settings_Keys_Pointer ptr;
1609 case RDP_SETTINGS_TYPE_STRING:
1621 char buffer[128] = { 0 };
1622 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32
" {%s}", __func__, flags, str);
1623 return test_serialize_with(src, buffer);
1626static BOOL add_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1628 ADDIN_ARGV* val = freerdp_addin_argv_new(argc, argv);
1631 if (!freerdp_static_channel_collection_add(src, val))
1633 if (!freerdp_static_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1635 if (!freerdp_dynamic_channel_collection_add(src, freerdp_addin_argv_clone(val)))
1641static BOOL add_dev_argv(rdpSettings* src,
size_t argc,
const char* argv[])
1643 FreeRDP_Settings_Keys_Pointer key = FreeRDP_DeviceArray;
1648 const uint32_t types[] = { RDPDR_DTYP_SERIAL, RDPDR_DTYP_PARALLEL, RDPDR_DTYP_PRINT,
1649 RDPDR_DTYP_FILESYSTEM, RDPDR_DTYP_SMARTCARD };
1651 for (
size_t x = 0; x < count; x++)
1653 const uint32_t type = types[x % ARRAYSIZE(types)];
1654 RDPDR_DEVICE* arg = freerdp_device_new(type, argc, argv);
1657 const BOOL rc = freerdp_settings_set_pointer_array(src, key, x, arg);
1658 freerdp_device_free(arg);
1665static BOOL fill_random(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key,
size_t elem,
1674 const size_t size = len * elem;
1675 char* random = calloc(len, elem);
1678 char* b64 = crypto_base64_encode(random, size);
1680 memcpy(data, b64, size);
1685static BOOL fill_random_timezone(rdpSettings* src)
1687 FreeRDP_Settings_Keys_Pointer key = FreeRDP_ClientTimeZone;
1694 (void)ConvertUtf8ToWChar(
"testXXXXDaylight", data->DaylightName, ARRAYSIZE(data->DaylightName));
1695 (void)ConvertUtf8ToWChar(
"testXXXX", data->StandardName, ARRAYSIZE(data->StandardName));
1700static BOOL set_private_key(rdpSettings* src)
1705 rdpPrivateKey* key =
1706 freerdp_settings_get_pointer_array_writable(src, FreeRDP_RdpServerRsaKey, 0);
1710 return freerdp_key_generate(key,
"RSA", 1, 4096);
1713static BOOL set_cert(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key)
1715 const char pem[] =
"-----BEGIN CERTIFICATE-----\n"
1716 "MIICvTCCAaWgAwIBAgIEZrM9yjANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAlt\n"
1717 "b3RvcmhlYWQwHhcNMjUwNDE1MTExMjE5WhcNMjYwNDE1MTExMjE5WjAUMRIwEAYD\n"
1718 "VQQDDAltb3RvcmhlYWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw\n"
1719 "g0tADY3kh5Hi6YsTsQbuaPs50zlTpIv+rCCK3BNIblsIh4cSO1YGdWfB0gP9bUD1\n"
1720 "L7mPWRnIiAvwrRA/Mgyo+UgiYj/aE3xxN3adB9/QsUzNrI07o6L8MupV4237txMj\n"
1721 "uxVmarB4c7E4wFgSxwbMQPhQtoNNew3bY+EeqhQBMFfYy4z+rg60xl0QHGcMePY/\n"
1722 "xz0WMHrIz6FhZfBIr+BGViRtjIchbjcU0HfTSujX+MT0D5MBISe8aiFvrewFItfT\n"
1723 "vglriDLeNMiB9U/aRLV8OtW+heGNhi5qSC9JXEW70OFeGAoqtwyRHLnSh38Fo2xv\n"
1724 "fEc90zjkCan8usEDKuzBAgMBAAGjFzAVMBMGA1UdJQQMMAoGCCsGAQUFBwMBMA0G\n"
1725 "CSqGSIb3DQEBCwUAA4IBAQBY1wkJ6XWduNmTi+UNdcZ5e9GWV/3+SYLtFALwKVrU\n"
1726 "KQQbsYnGLfyUKXFc7e9JoZ+UCTJgY3EyL+6p79io+cFeTtpp1RVKljibbeRAP01W\n"
1727 "WbcxcHZFKgBlH1KNSeO7iOAPet3aCaVDKl1XSU7fhxtsfBBI9YTtaMZM5e9WhuHK\n"
1728 "lL11Un6ePThX+4NG1yYp0X+emqUHd/qaq8IShnU6ajvzoloWGf4vLlDSsuFHJJsK\n"
1729 "LnshNFOFGAjp1Se4DjhtUSr6Xofdse+kx9cSQazCZ5vFJNeHkxr0B7ojQ4bN37Tg\n"
1730 "2uyfSclCCLnmjcoRMlIGUiL2bevCPDRNRWiblDgx3tGG\n"
1731 "-----END CERTIFICATE-----\n";
1733 rdpCertificate* cert = freerdp_certificate_new_from_pem(pem);
1739static BOOL set_string_array(rdpSettings* src, FreeRDP_Settings_Keys_Pointer key, uint32_t max)
1742 winpr_RAND(&count,
sizeof(count));
1743 count = count % max;
1748 for (uint32_t x = 0; x < count; x++)
1750 char buffer[32] = { 0 };
1751 (void)_snprintf(buffer,
sizeof(buffer),
"foobar-0x%08" PRIu32, x);
1752 if (!freerdp_settings_set_pointer_array(src, key, x, buffer))
1758static BOOL test_serialize_pointer(DWORD flags)
1765 const char* argv1[] = {
"foobar",
"lala",
"haha" };
1766 const char* argv2[] = {
"lala",
"haha" };
1767 const char* argv3[] = {
"haha" };
1768 if (!add_argv(src, ARRAYSIZE(argv1), argv1))
1770 if (!add_argv(src, ARRAYSIZE(argv2), argv2))
1772 if (!add_argv(src, ARRAYSIZE(argv3), argv3))
1774 if (!add_dev_argv(src, ARRAYSIZE(argv3), argv3))
1779 FreeRDP_Settings_Keys_Pointer key;
1784 const struct key_len_pair keys[] = {
1785 { FreeRDP_ServerRandom, 1, 123 },
1786 { FreeRDP_RedirectionPassword, 1, 13 },
1787 { FreeRDP_ClientRandom, 1, 23 },
1788 { FreeRDP_RedirectionGuid, 1, 22 },
1789 { FreeRDP_LoadBalanceInfo, 1, 21 },
1790 { FreeRDP_ServerCertificate, 1, 512 },
1791 { FreeRDP_RedirectionTsvUrl, 1, 33 },
1795 { FreeRDP_OrderSupport, 1, 32 },
1798 { FreeRDP_Password51, 1, 54 },
1799 { FreeRDP_MonitorIds, 1, 111 },
1800 { FreeRDP_MonitorDefArray, 1, 7 },
1801 { FreeRDP_ChannelDefArray, 1, 31 },
1802 { FreeRDP_ReceivedCapabilities,
sizeof(uint8_t), 33 },
1803 { FreeRDP_ReceivedCapabilityData,
sizeof(uint8_t*), 33 },
1804 { FreeRDP_ReceivedCapabilityDataSizes,
sizeof(UINT32), 33 }
1807 for (
size_t x = 0; x < ARRAYSIZE(keys); x++)
1809 const struct key_len_pair* cur = &keys[x];
1810 if (!fill_random(src, cur->key, cur->elem, cur->len))
1814 if (!fill_random_timezone(src))
1818 winpr_RAND((
void*)&ptr,
sizeof(
void*));
1822 if (!set_private_key(src))
1824 if (!set_cert(src, FreeRDP_RedirectionTargetCertificate))
1826 if (!set_cert(src, FreeRDP_RdpServerCertificate))
1829 if (!set_string_array(src, FreeRDP_ServerLicenseProductIssuers, 43))
1832 char addresses[12][43] = { 0 };
1833 char* strptr[12] = { 0 };
1835 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1837 (void)_snprintf(addresses[x], 43,
"foobar-0x%08" PRIx32, x);
1838 strptr[x] = addresses[x];
1841 if (!freerdp_target_net_addresses_copy(src, strptr, ARRAYSIZE(addresses)))
1844 for (
size_t x = 0; x < ARRAYSIZE(addresses); x++)
1847 winpr_RAND(&port,
sizeof(port));
1848 if (!freerdp_settings_set_pointer_array(src, FreeRDP_TargetNetPorts, x, &port))
1859 winpr_RAND(caps, count);
1861 for (uint32_t x = 0; x < count; x++)
1863 uint8_t* buffer = calloc(64,
sizeof(uint8_t));
1866 winpr_RAND(buffer,
sizeof(buffer));
1867 uint32_t blen = (buffer[0] % 52) + 13;
1869 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityData, x, buffer))
1871 if (!freerdp_settings_set_pointer_array(src, FreeRDP_ReceivedCapabilityDataSizes, x, &blen))
1875 char buffer[128] = { 0 };
1876 (void)_snprintf(buffer,
sizeof(buffer),
"%s flags 0x%08" PRIx32, __func__, flags);
1877 return test_serialize_with(src, buffer);
1884static BOOL test_serialize(
void)
1894 for (uint32_t flags = 0;
1897 char buffer[32] = { 0 };
1898 (void)_snprintf(buffer,
sizeof(buffer),
"default (flags 0x%08" PRIx32
")", flags);
1901 if (!test_serialize_strings(flags,
"foobar"))
1903 if (!test_serialize_strings(flags,
""))
1905 if (!test_serialize_strings(flags, NULL))
1907 if (!test_serialize_pointer(flags))
1917static BOOL test_bool_list(rdpSettings* settings,
const rdpSettings* cloned)
1922 WINPR_ASSERT(settings);
1923 WINPR_ASSERT(cloned);
1925#if defined(have_bool_list_indices)
1927 for (
size_t x = 0; x < ARRAYSIZE(bool_list_indices); x++)
1929 const size_t key = bool_list_indices[x];
1936 printf(
"mismatch for key %s: %u -> copy %u\n", name, val, cval);
1941 if (!check_key_helpers(key,
"bool"))
1948 return log_result(rc);
1951static BOOL test_int16_list(
const rdpSettings* settings,
const rdpSettings* cloned)
1956 WINPR_ASSERT(settings);
1957 WINPR_ASSERT(cloned);
1959#if defined(have_int16_list_indices)
1961 for (
size_t x = 0; x < ARRAYSIZE(int16_list_indices); x++)
1963 const size_t key = int16_list_indices[x];
1969 printf(
"mismatch for key %s: %" PRId16
" -> copy %" PRId16
"\n", name, val, cval);
1974 if (!check_key_helpers(key,
"int16"))
1981 return log_result(rc);
1984static BOOL test_uint16_list(rdpSettings* settings,
const rdpSettings* cloned)
1989 WINPR_ASSERT(settings);
1990 WINPR_ASSERT(cloned);
1992#if defined(have_uint16_list_indices)
1994 for (
size_t x = 0; x < ARRAYSIZE(uint16_list_indices); x++)
1996 const size_t key = uint16_list_indices[x];
2003 printf(
"mismatch for key %s: %" PRIu16
" -> copy %" PRIu16
"\n", name, val, cval);
2008 if (!check_key_helpers(key,
"uint16"))
2015 return log_result(rc);
2018static BOOL test_int32_list(rdpSettings* settings,
const rdpSettings* cloned)
2023 WINPR_ASSERT(settings);
2024 WINPR_ASSERT(cloned);
2026#if defined(have_int32_list_indices)
2028 for (
size_t x = 0; x < ARRAYSIZE(int32_list_indices); x++)
2030 const size_t key = int32_list_indices[x];
2037 printf(
"mismatch for key %s: %" PRId32
" -> copy %" PRId32
"\n", name, val, cval);
2042 if (!check_key_helpers(key,
"int32"))
2050 return log_result(rc);
2053static BOOL test_uint32_list(rdpSettings* settings,
const rdpSettings* cloned)
2058 WINPR_ASSERT(settings);
2059 WINPR_ASSERT(cloned);
2061#if defined(have_uint32_list_indices)
2063 for (
size_t x = 0; x < ARRAYSIZE(uint32_list_indices); x++)
2065 const size_t key = uint32_list_indices[x];
2072 printf(
"mismatch for key %s: %" PRIu32
" -> copy %" PRIu32
"\n", name, val, cval);
2077 if (!check_key_helpers(key,
"uint32"))
2085 return log_result(rc);
2088static BOOL test_int64_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2093 WINPR_ASSERT(settings);
2094 WINPR_ASSERT(cloned);
2096#if defined(have_int64_list_indices)
2098 for (
size_t x = 0; x < ARRAYSIZE(int64_list_indices); x++)
2100 const size_t key = int64_list_indices[x];
2106 printf(
"mismatch for key %s: %" PRId64
" -> copy %" PRId64
"\n", name, val, cval);
2111 if (!check_key_helpers(key,
"int64"))
2119 return log_result(rc);
2122static BOOL test_uint64_list(rdpSettings* settings,
const rdpSettings* cloned)
2127 WINPR_ASSERT(settings);
2128 WINPR_ASSERT(cloned);
2130#if defined(have_uint64_list_indices)
2132 for (
size_t x = 0; x < ARRAYSIZE(uint64_list_indices); x++)
2134 const size_t key = uint64_list_indices[x];
2141 printf(
"mismatch for key %s: %" PRIu64
" -> copy %" PRIu64
"\n", name, val, cval);
2146 if (!check_key_helpers(key,
"uint64"))
2154 return log_result(rc);
2157static BOOL test_string_list(rdpSettings* settings,
const rdpSettings* cloned)
2162 WINPR_ASSERT(settings);
2163 WINPR_ASSERT(cloned);
2165#if defined(have_string_list_indices)
2167 for (
size_t x = 0; x < ARRAYSIZE(string_list_indices); x++)
2169 const size_t key = string_list_indices[x];
2170 const char val[] =
"test-string";
2171 const char* res = NULL;
2176 if ((oval != cval) && (strcmp(oval, cval) != 0))
2178 printf(
"mismatch for key %s: %s -> copy %s\n", name, oval, cval);
2186 if (strncmp(val, res,
sizeof(val)) != 0)
2194 return log_result(rc);
2197static BOOL test_pointer_list(
const rdpSettings* settings,
const rdpSettings* cloned)
2202 WINPR_ASSERT(settings);
2203 WINPR_ASSERT(cloned);
2205#if defined(have_pointer_list_indices)
2207 for (
size_t x = 0; x < ARRAYSIZE(pointer_list_indices); x++)
2209 const size_t key = pointer_list_indices[x];
2218 return log_result(rc);
2221static BOOL test_clone_copy(
const rdpSettings* settings,
const rdpSettings* cloned)
2225 WINPR_ASSERT(settings);
2226 WINPR_ASSERT(cloned);
2236 return log_result(rc);
2239static BOOL test_all(
void)
2245 rdpSettings* cloned = NULL;
2249 printf(
"Couldn't create settings\n");
2253 if (!test_string_len(settings))
2261 if (!test_bool_list(settings, cloned))
2263 if (!test_int16_list(settings, cloned))
2265 if (!test_uint16_list(settings, cloned))
2267 if (!test_int32_list(settings, cloned))
2269 if (!test_uint32_list(settings, cloned))
2271 if (!test_int64_list(settings, cloned))
2273 if (!test_uint64_list(settings, cloned))
2275 if (!test_string_list(settings, cloned))
2277 if (!test_pointer_list(settings, cloned))
2279 if (!test_clone_copy(settings, cloned))
2286 return log_result(rc);
2289#if defined(BUILD_TESTING_INTERNAL)
2290static FreeRDP_Settings_Keys_UInt32 getLenForKey(FreeRDP_Settings_Keys_Pointer key)
2292 return FreeRDP_TargetNetAddressCount;
2295static bool fillTargetBuffer(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key)
2298 for (
size_t x = 0; x < count; x++)
2300 char test[128] = { 0 };
2301 (void)_snprintf(test,
sizeof(test),
"test_value_%" PRIuz, x);
2302 if (!freerdp_settings_set_pointer_array(settings, key, x, test))
2308static bool checkTargetBuffer(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2311 for (
size_t x = 0; x < count; x++)
2313 char test[128] = { 0 };
2314 (void)_snprintf(test,
sizeof(test),
"test_value_%" PRIuz, x);
2315 const char* cmp = freerdp_settings_get_pointer_array(settings, key, x);
2318 if (strncmp(test, cmp,
sizeof(test)) != 0)
2324static bool checkTargetBufferResized(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
2325 size_t count,
size_t newSize)
2327 if (count > newSize)
2330 if (!checkTargetBuffer(settings, key, count))
2333 for (
size_t x = count; x < newSize; x++)
2335 const char* cmp = freerdp_settings_get_pointer_array(settings, key, x);
2342static bool testSize(rdpSettings* settings, FreeRDP_Settings_Keys_Pointer key,
size_t newSize)
2344 if (!fillTargetBuffer(settings, key))
2347 if (!checkTargetBuffer(settings, key, count))
2349 if (key == FreeRDP_TargetNetAddresses)
2351 if (!freerdp_target_net_addresses_resize(settings, newSize))
2358 if (!checkTargetBufferResized(settings, key, count, newSize))
2363static bool testBufferResize(FreeRDP_Settings_Keys_Pointer key)
2370 if (!testSize(settings, key, 10))
2372 if (!testSize(settings, key, 23))
2374 if (!testSize(settings, key, 13))
2376 if (!testSize(settings, key, 0))
2386int TestSettings(
int argc,
char* argv[])
2392 if (!test_serialize())
2394 if (!test_dyn_channels())
2396 if (!test_static_channels())
2400 if (!test_helpers())
2402 if (!check_device_type())
2404 if (!test_pointer_array())
2406 if (!test_validity_check())
2410#if defined(BUILD_TESTING_INTERNAL)
2412 if (!testBufferResize(FreeRDP_TargetNetAddresses))
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.