1#include <freerdp/config.h>
3#include <freerdp/client.h>
4#include <freerdp/client/cmdline.h>
5#include <freerdp/settings.h>
6#include <winpr/cmdline.h>
8#include <winpr/strlst.h>
9#include <winpr/collections.h>
11typedef BOOL (*validate_settings_pr)(rdpSettings* settings);
12typedef void (*setup_settings_pr)(rdpSettings* settings);
14#define printref() printf("%s:%d: in function %-40s:", __FILE__, __LINE__, __func__)
16#define TEST_ERROR(format, ...) \
19 (void)fprintf(stderr, format, ##__VA_ARGS__); \
21 (void)printf(format, ##__VA_ARGS__); \
22 (void)fflush(stdout); \
25#define TEST_FAILURE(format, ...) \
29 (void)printf(" FAILURE "); \
30 (void)printf(format, ##__VA_ARGS__); \
31 (void)fflush(stdout); \
34static void print_test_title(
int argc,
char** argv)
36 printf(
"Running test:");
38 for (
int i = 0; i < argc; i++)
40 printf(
" %s", argv[i]);
46static inline BOOL testcase(
const char* name,
char** argv,
size_t argc,
int expected_return,
47 validate_settings_pr validate_settings,
48 setup_settings_pr setup_settings)
51 BOOL valid_settings = TRUE;
54 WINPR_ASSERT(argc <= INT_MAX);
56 print_test_title((
int)argc, argv);
60 TEST_ERROR(
"Test %s could not allocate settings!\n", name);
65 setup_settings(settings);
67 status = freerdp_client_settings_parse_command_line(settings, (
int)argc, argv, FALSE);
69 if (validate_settings)
71 valid_settings = validate_settings(settings);
76 if (status == expected_return)
85 TEST_FAILURE(
"Expected status %d, got status %d\n", expected_return, status);
93#define DRIVE_REDIRECT_PATH "c:\\Windows"
95#define DRIVE_REDIRECT_PATH "/tmp"
98static BOOL check_settings_gateway_response_timeout(rdpSettings* settings, UINT32 expected)
104 TEST_FAILURE(
"Expected GatewayResponseTimeout = %" PRIu32
", but got %" PRIu32
"!\n",
112static BOOL check_settings_gateway_response_timeout_default(rdpSettings* settings)
114 return check_settings_gateway_response_timeout(settings, 15000);
117static BOOL check_settings_gateway_response_timeout_custom(rdpSettings* settings)
119 return check_settings_gateway_response_timeout(settings, 120000);
122static const char test_aad_user_agent[] =
"TestAgent/1.0 (KHTML, like Gecko)";
124static BOOL check_settings_aad_user_agent(rdpSettings* settings)
127 if (!ua || (strcmp(ua, test_aad_user_agent) != 0))
129 TEST_FAILURE(
"Expected AadAuthUserAgent = \"%s\", but got %s!\n", test_aad_user_agent,
136static BOOL check_settings_smartcard_no_redirection(rdpSettings* settings)
142 TEST_FAILURE(
"Expected RedirectSmartCards = FALSE, but RedirectSmartCards = TRUE!\n");
146 if (freerdp_device_collection_find_type(settings, RDPDR_DTYP_SMARTCARD))
148 TEST_FAILURE(
"Expected no SMARTCARD device, but found at least one!\n");
155#ifndef TEST_SOURCE_DIR
156#error "TEST_SOURCE_DIR must be defined to the test source directory"
158#define DISABLED_DISPLAY_OPTIONS_RDP TEST_SOURCE_DIR "/rdp-cmdline/disabled-display-options.rdp"
160static BOOL check_settings_multimon_disabled(rdpSettings* settings)
166 TEST_FAILURE(
"Expected UseMultimon = FALSE, but UseMultimon = TRUE!\n");
172 TEST_FAILURE(
"Expected ForceMultimon = FALSE, but ForceMultimon = TRUE!\n");
178 TEST_FAILURE(
"Expected SmartSizing = TRUE, but SmartSizing = FALSE!\n");
185static BOOL check_settings_smart_sizing_disabled(rdpSettings* settings)
191 TEST_FAILURE(
"Expected SmartSizing = FALSE, but SmartSizing = TRUE!\n");
198 "Expected DynamicResolutionUpdate = TRUE, but DynamicResolutionUpdate = FALSE!\n");
204 TEST_FAILURE(
"Expected UseMultimon = TRUE, but UseMultimon = FALSE!\n");
211static BOOL check_settings_multimon_enabled(rdpSettings* settings)
217 TEST_FAILURE(
"Expected UseMultimon = TRUE, but UseMultimon = FALSE!\n");
224static void setup_settings_multimon_force(rdpSettings* settings)
229static BOOL check_settings_multimon_force(rdpSettings* settings)
235 TEST_FAILURE(
"Expected UseMultimon = TRUE, but UseMultimon = FALSE!\n");
241 TEST_FAILURE(
"Expected ForceMultimon = TRUE, but ForceMultimon = FALSE!\n");
248static BOOL check_settings_smart_sizing_size(rdpSettings* settings)
254 TEST_FAILURE(
"Expected SmartSizing = TRUE, but SmartSizing = FALSE!\n");
260 TEST_FAILURE(
"Expected SmartSizingWidth = 1024, but SmartSizingWidth = %u!\n",
267 TEST_FAILURE(
"Expected SmartSizingHeight = 768, but SmartSizingHeight = %u!\n",
275#if defined(WITH_GFX_AV1)
276static BOOL check_settings_gfx_av1(rdpSettings* settings)
282 TEST_FAILURE(
"Expected GfxCodecAV1 = TRUE, but GfxCodecAV1 = FALSE!\n");
290static BOOL check_settings_gfx_without_h264(rdpSettings* settings)
296 TEST_FAILURE(
"Expected ConnectionType = AUTODETECT, but ConnectionType = %u!\n",
306 "Expected the H.264 codecs off as /gfx asked, but /network:auto turned them on!\n");
312 TEST_FAILURE(
"Expected GfxProgressive = TRUE, but GfxProgressive = FALSE!\n");
319static BOOL check_settings_network_auto_h264(rdpSettings* settings)
326 TEST_FAILURE(
"Expected /network:auto alone to turn the H.264 codecs on!\n");
333static BOOL check_settings_modem_with_fonts(rdpSettings* settings)
339 TEST_FAILURE(
"Expected ConnectionType = MODEM, but ConnectionType = %u!\n",
346 TEST_FAILURE(
"Expected AllowFontSmoothing = TRUE as +fonts asked, but /network:modem "
353 TEST_FAILURE(
"Expected DisableWallpaper = TRUE, the default of /network:modem!\n");
363 validate_settings_pr validate_settings;
364 const char* command_line[128];
368 const char* expected_value;
369 } modified_arguments[8];
370 setup_settings_pr setup_settings;
374static const test tests[] = {
375 { COMMAND_LINE_STATUS_PRINT_HELP,
376 check_settings_smartcard_no_redirection,
377 {
"testfreerdp",
"--help",
nullptr },
378 { WINPR_C_ARRAY_INIT } },
379 { COMMAND_LINE_STATUS_PRINT_HELP,
380 check_settings_smartcard_no_redirection,
381 {
"testfreerdp",
"/help",
nullptr },
382 { WINPR_C_ARRAY_INIT } },
383 { COMMAND_LINE_STATUS_PRINT_HELP,
384 check_settings_smartcard_no_redirection,
385 {
"testfreerdp",
"-help",
nullptr },
386 { WINPR_C_ARRAY_INIT } },
387 { COMMAND_LINE_STATUS_PRINT_VERSION,
388 check_settings_smartcard_no_redirection,
389 {
"testfreerdp",
"--version",
nullptr },
390 { WINPR_C_ARRAY_INIT } },
391 { COMMAND_LINE_STATUS_PRINT_VERSION,
392 check_settings_smartcard_no_redirection,
393 {
"testfreerdp",
"/version",
nullptr },
394 { WINPR_C_ARRAY_INIT } },
395 { COMMAND_LINE_STATUS_PRINT_VERSION,
396 check_settings_smartcard_no_redirection,
397 {
"testfreerdp",
"-version",
nullptr },
398 { WINPR_C_ARRAY_INIT } },
400 check_settings_smartcard_no_redirection,
401 {
"testfreerdp",
"-v",
"test.freerdp.com",
nullptr },
402 { WINPR_C_ARRAY_INIT } },
404 check_settings_smartcard_no_redirection,
405 {
"testfreerdp",
"--v",
"test.freerdp.com",
nullptr },
406 { WINPR_C_ARRAY_INIT } },
408 check_settings_smartcard_no_redirection,
409 {
"testfreerdp",
"/v:test.freerdp.com",
nullptr },
410 { WINPR_C_ARRAY_INIT } },
412 check_settings_smartcard_no_redirection,
413 {
"testfreerdp",
"/sound",
"/drive:media," DRIVE_REDIRECT_PATH,
"/v:test.freerdp.com",
415 { WINPR_C_ARRAY_INIT } },
417 check_settings_smartcard_no_redirection,
418 {
"testfreerdp",
"-u",
"test",
"-p",
"test",
"-v",
"test.freerdp.com",
nullptr },
419 { { 4,
"****" }, WINPR_C_ARRAY_INIT } },
421 check_settings_smartcard_no_redirection,
422 {
"testfreerdp",
"/u:test",
"/p:test",
"/v:test.freerdp.com",
nullptr },
423 { { 2,
"/p:****" }, WINPR_C_ARRAY_INIT } },
424 { COMMAND_LINE_ERROR_NO_KEYWORD,
425 check_settings_smartcard_no_redirection,
426 {
"testfreerdp",
"-invalid",
nullptr },
427 { WINPR_C_ARRAY_INIT } },
428 { COMMAND_LINE_ERROR_NO_KEYWORD,
429 check_settings_smartcard_no_redirection,
430 {
"testfreerdp",
"--invalid",
nullptr },
431 { WINPR_C_ARRAY_INIT } },
432#if defined(WITH_FREERDP_DEPRECATED_CMDLINE)
433 { COMMAND_LINE_STATUS_PRINT,
434 check_settings_smartcard_no_redirection,
435 {
"testfreerdp",
"/kbd-list", 0 },
436 { WINPR_C_ARRAY_INIT } },
437 { COMMAND_LINE_STATUS_PRINT,
438 check_settings_smartcard_no_redirection,
439 {
"testfreerdp",
"/monitor-list", 0 },
440 { WINPR_C_ARRAY_INIT } },
442 { COMMAND_LINE_STATUS_PRINT,
443 check_settings_smartcard_no_redirection,
444 {
"testfreerdp",
"/list:kbd",
nullptr },
445 { WINPR_C_ARRAY_INIT } },
446 { COMMAND_LINE_STATUS_PRINT,
447 check_settings_smartcard_no_redirection,
448 {
"testfreerdp",
"/list:monitor",
nullptr },
449 { WINPR_C_ARRAY_INIT } },
451 check_settings_smartcard_no_redirection,
452 {
"testfreerdp",
"/sound",
"/drive:media:" DRIVE_REDIRECT_PATH,
"/v:test.freerdp.com",
454 { WINPR_C_ARRAY_INIT } },
456 check_settings_smartcard_no_redirection,
457 {
"testfreerdp",
"/sound",
"/drive:media,/foo/bar/blabla",
"/v:test.freerdp.com",
nullptr },
458 { WINPR_C_ARRAY_INIT } },
460 check_settings_gateway_response_timeout_default,
461 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com",
"/v:test.freerdp.com",
nullptr },
462 { WINPR_C_ARRAY_INIT } },
464 check_settings_gateway_response_timeout_custom,
465 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com,timeout:120000",
"/v:test.freerdp.com",
467 { WINPR_C_ARRAY_INIT } },
469 check_settings_gateway_response_timeout_custom,
470 {
"testfreerdp",
"/gateway:type:http,g:gw.contoso.com,timeout:120000",
"/v:test.freerdp.com",
472 { WINPR_C_ARRAY_INIT } },
473 { COMMAND_LINE_ERROR,
474 check_settings_gateway_response_timeout_default,
475 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com,timeout:0",
"/v:test.freerdp.com",
477 { WINPR_C_ARRAY_INIT } },
478 { COMMAND_LINE_ERROR,
479 check_settings_gateway_response_timeout_default,
480 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com,timeout:abc",
"/v:test.freerdp.com",
482 { WINPR_C_ARRAY_INIT } },
484 check_settings_aad_user_agent,
485 {
"testfreerdp",
"/azure:tenantid:common,\"user-agent:TestAgent/1.0 (KHTML, like Gecko)\"",
486 "/v:test.freerdp.com",
nullptr },
487 { WINPR_C_ARRAY_INIT } },
489 check_settings_multimon_disabled,
490 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"/multimon:off",
nullptr },
491 { WINPR_C_ARRAY_INIT },
492 setup_settings_multimon_force },
494 check_settings_multimon_disabled,
495 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"-multimon",
nullptr },
496 { WINPR_C_ARRAY_INIT },
497 setup_settings_multimon_force },
499 check_settings_smart_sizing_disabled,
500 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"-smart-sizing",
nullptr },
501 { WINPR_C_ARRAY_INIT } },
503 check_settings_smart_sizing_disabled,
504 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"/smart-sizing:off",
nullptr },
505 { WINPR_C_ARRAY_INIT } },
507 check_settings_multimon_force,
508 {
"testfreerdp",
"--multimon",
"force",
nullptr },
509 { WINPR_C_ARRAY_INIT } },
511 check_settings_smart_sizing_size,
512 {
"testfreerdp",
"--smart-sizing",
"1024x768",
nullptr },
513 { WINPR_C_ARRAY_INIT } },
514 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
515 check_settings_smartcard_no_redirection,
516 {
"testfreerdp",
"/multimon:garbage",
nullptr },
517 { WINPR_C_ARRAY_INIT } },
518 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
519 check_settings_smartcard_no_redirection,
520 {
"testfreerdp",
"/smart-sizing:garbage",
nullptr },
521 { WINPR_C_ARRAY_INIT } },
522 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
523 check_settings_smartcard_no_redirection,
524 {
"testfreerdp",
"/multimon:",
nullptr },
525 { WINPR_C_ARRAY_INIT } },
526 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
527 check_settings_smartcard_no_redirection,
528 {
"testfreerdp",
"/smart-sizing:",
nullptr },
529 { WINPR_C_ARRAY_INIT } },
531 check_settings_multimon_enabled,
532 {
"testfreerdp",
"+multimon",
nullptr },
533 { WINPR_C_ARRAY_INIT } },
534#if defined(WITH_GFX_H264)
536 check_settings_gfx_without_h264,
537 {
"testfreerdp",
"/gfx:progressive,AVC420:off,AVC444:off",
"/network:auto",
538 "/v:test.freerdp.com",
nullptr },
539 { WINPR_C_ARRAY_INIT } },
541 check_settings_gfx_without_h264,
542 {
"testfreerdp",
"/network:auto",
"/gfx:progressive,AVC420:off,AVC444:off",
543 "/v:test.freerdp.com",
nullptr },
544 { WINPR_C_ARRAY_INIT } },
546 check_settings_network_auto_h264,
547 {
"testfreerdp",
"/network:auto",
"/v:test.freerdp.com",
nullptr },
548 { WINPR_C_ARRAY_INIT } },
550#if defined(WITH_GFX_AV1)
552 check_settings_gfx_av1,
553 {
"testfreerdp",
"/gfx:AV1",
"/v:test.freerdp.com",
nullptr },
554 { WINPR_C_ARRAY_INIT } },
556 check_settings_gfx_av1,
557 {
"testfreerdp",
"/gfx:AV1:on",
"/v:test.freerdp.com",
nullptr },
558 { WINPR_C_ARRAY_INIT } },
561 check_settings_modem_with_fonts,
562 {
"testfreerdp",
"+fonts",
"/network:modem",
"/v:test.freerdp.com",
nullptr },
563 { WINPR_C_ARRAY_INIT } },
567static void check_modified_arguments(
const test* test,
char** command_line,
int* rc)
569 const char* expected_argument =
nullptr;
571 for (
int k = 0; (expected_argument = test->modified_arguments[k].expected_value); k++)
573 int index = test->modified_arguments[k].index;
574 char* actual_argument = command_line[index];
576 if (0 != strcmp(actual_argument, expected_argument))
579 printf(
"Failure: overridden argument %d is %s but it should be %s\n", index,
580 actual_argument, expected_argument);
581 (void)fflush(stdout);
587int TestClientCmdLine(
int argc,
char* argv[])
593 for (
size_t i = 0; i < ARRAYSIZE(tests); i++)
595 const test* current = &tests[i];
597 char** command_line = string_list_copy(current->command_line);
599 const int len = string_list_length((
const char*
const*)command_line);
600 if (!testcase(__func__, command_line, WINPR_ASSERTING_INT_CAST(
size_t, len),
601 current->expected_status, current->validate_settings,
602 current->setup_settings))
604 TEST_FAILURE(
"parsing arguments.\n");
608 check_modified_arguments(current, command_line, &failure);
612 string_list_print(stdout, (
const char*
const*)command_line);
616 string_list_free(command_line);
FREERDP_API rdpSettings * freerdp_settings_new(DWORD flags)
creates a new setting struct
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
FREERDP_API void freerdp_settings_free(rdpSettings *settings)
Free a settings struct with all data in it.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_get_bool(const rdpSettings *settings, FreeRDP_Settings_Keys_Bool id)
Returns a boolean settings value.