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",
275static BOOL check_settings_gfx_without_h264(rdpSettings* settings)
281 TEST_FAILURE(
"Expected ConnectionType = AUTODETECT, but ConnectionType = %u!\n",
291 "Expected the H.264 codecs off as /gfx asked, but /network:auto turned them on!\n");
297 TEST_FAILURE(
"Expected GfxProgressive = TRUE, but GfxProgressive = FALSE!\n");
304static BOOL check_settings_network_auto_h264(rdpSettings* settings)
311 TEST_FAILURE(
"Expected /network:auto alone to turn the H.264 codecs on!\n");
318static BOOL check_settings_modem_with_fonts(rdpSettings* settings)
324 TEST_FAILURE(
"Expected ConnectionType = MODEM, but ConnectionType = %u!\n",
331 TEST_FAILURE(
"Expected AllowFontSmoothing = TRUE as +fonts asked, but /network:modem "
338 TEST_FAILURE(
"Expected DisableWallpaper = TRUE, the default of /network:modem!\n");
348 validate_settings_pr validate_settings;
349 const char* command_line[128];
353 const char* expected_value;
354 } modified_arguments[8];
355 setup_settings_pr setup_settings;
359static const test tests[] = {
360 { COMMAND_LINE_STATUS_PRINT_HELP,
361 check_settings_smartcard_no_redirection,
362 {
"testfreerdp",
"--help",
nullptr },
363 { WINPR_C_ARRAY_INIT } },
364 { COMMAND_LINE_STATUS_PRINT_HELP,
365 check_settings_smartcard_no_redirection,
366 {
"testfreerdp",
"/help",
nullptr },
367 { WINPR_C_ARRAY_INIT } },
368 { COMMAND_LINE_STATUS_PRINT_HELP,
369 check_settings_smartcard_no_redirection,
370 {
"testfreerdp",
"-help",
nullptr },
371 { WINPR_C_ARRAY_INIT } },
372 { COMMAND_LINE_STATUS_PRINT_VERSION,
373 check_settings_smartcard_no_redirection,
374 {
"testfreerdp",
"--version",
nullptr },
375 { WINPR_C_ARRAY_INIT } },
376 { COMMAND_LINE_STATUS_PRINT_VERSION,
377 check_settings_smartcard_no_redirection,
378 {
"testfreerdp",
"/version",
nullptr },
379 { WINPR_C_ARRAY_INIT } },
380 { COMMAND_LINE_STATUS_PRINT_VERSION,
381 check_settings_smartcard_no_redirection,
382 {
"testfreerdp",
"-version",
nullptr },
383 { WINPR_C_ARRAY_INIT } },
385 check_settings_smartcard_no_redirection,
386 {
"testfreerdp",
"-v",
"test.freerdp.com",
nullptr },
387 { WINPR_C_ARRAY_INIT } },
389 check_settings_smartcard_no_redirection,
390 {
"testfreerdp",
"--v",
"test.freerdp.com",
nullptr },
391 { WINPR_C_ARRAY_INIT } },
393 check_settings_smartcard_no_redirection,
394 {
"testfreerdp",
"/v:test.freerdp.com",
nullptr },
395 { WINPR_C_ARRAY_INIT } },
397 check_settings_smartcard_no_redirection,
398 {
"testfreerdp",
"/sound",
"/drive:media," DRIVE_REDIRECT_PATH,
"/v:test.freerdp.com",
400 { WINPR_C_ARRAY_INIT } },
402 check_settings_smartcard_no_redirection,
403 {
"testfreerdp",
"-u",
"test",
"-p",
"test",
"-v",
"test.freerdp.com",
nullptr },
404 { { 4,
"****" }, WINPR_C_ARRAY_INIT } },
406 check_settings_smartcard_no_redirection,
407 {
"testfreerdp",
"/u:test",
"/p:test",
"/v:test.freerdp.com",
nullptr },
408 { { 2,
"/p:****" }, WINPR_C_ARRAY_INIT } },
409 { COMMAND_LINE_ERROR_NO_KEYWORD,
410 check_settings_smartcard_no_redirection,
411 {
"testfreerdp",
"-invalid",
nullptr },
412 { WINPR_C_ARRAY_INIT } },
413 { COMMAND_LINE_ERROR_NO_KEYWORD,
414 check_settings_smartcard_no_redirection,
415 {
"testfreerdp",
"--invalid",
nullptr },
416 { WINPR_C_ARRAY_INIT } },
417#if defined(WITH_FREERDP_DEPRECATED_CMDLINE)
418 { COMMAND_LINE_STATUS_PRINT,
419 check_settings_smartcard_no_redirection,
420 {
"testfreerdp",
"/kbd-list", 0 },
421 { WINPR_C_ARRAY_INIT } },
422 { COMMAND_LINE_STATUS_PRINT,
423 check_settings_smartcard_no_redirection,
424 {
"testfreerdp",
"/monitor-list", 0 },
425 { WINPR_C_ARRAY_INIT } },
427 { COMMAND_LINE_STATUS_PRINT,
428 check_settings_smartcard_no_redirection,
429 {
"testfreerdp",
"/list:kbd",
nullptr },
430 { WINPR_C_ARRAY_INIT } },
431 { COMMAND_LINE_STATUS_PRINT,
432 check_settings_smartcard_no_redirection,
433 {
"testfreerdp",
"/list:monitor",
nullptr },
434 { WINPR_C_ARRAY_INIT } },
436 check_settings_smartcard_no_redirection,
437 {
"testfreerdp",
"/sound",
"/drive:media:" DRIVE_REDIRECT_PATH,
"/v:test.freerdp.com",
439 { WINPR_C_ARRAY_INIT } },
441 check_settings_smartcard_no_redirection,
442 {
"testfreerdp",
"/sound",
"/drive:media,/foo/bar/blabla",
"/v:test.freerdp.com",
nullptr },
443 { WINPR_C_ARRAY_INIT } },
445 check_settings_gateway_response_timeout_default,
446 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com",
"/v:test.freerdp.com",
nullptr },
447 { WINPR_C_ARRAY_INIT } },
449 check_settings_gateway_response_timeout_custom,
450 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com,timeout:120000",
"/v:test.freerdp.com",
452 { WINPR_C_ARRAY_INIT } },
454 check_settings_gateway_response_timeout_custom,
455 {
"testfreerdp",
"/gateway:type:http,g:gw.contoso.com,timeout:120000",
"/v:test.freerdp.com",
457 { WINPR_C_ARRAY_INIT } },
458 { COMMAND_LINE_ERROR,
459 check_settings_gateway_response_timeout_default,
460 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com,timeout:0",
"/v:test.freerdp.com",
462 { WINPR_C_ARRAY_INIT } },
463 { COMMAND_LINE_ERROR,
464 check_settings_gateway_response_timeout_default,
465 {
"testfreerdp",
"/gateway:type:arm,g:gw.contoso.com,timeout:abc",
"/v:test.freerdp.com",
467 { WINPR_C_ARRAY_INIT } },
469 check_settings_aad_user_agent,
470 {
"testfreerdp",
"/azure:tenantid:common,\"user-agent:TestAgent/1.0 (KHTML, like Gecko)\"",
471 "/v:test.freerdp.com",
nullptr },
472 { WINPR_C_ARRAY_INIT } },
474 check_settings_multimon_disabled,
475 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"/multimon:off",
nullptr },
476 { WINPR_C_ARRAY_INIT },
477 setup_settings_multimon_force },
479 check_settings_multimon_disabled,
480 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"-multimon",
nullptr },
481 { WINPR_C_ARRAY_INIT },
482 setup_settings_multimon_force },
484 check_settings_smart_sizing_disabled,
485 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"-smart-sizing",
nullptr },
486 { WINPR_C_ARRAY_INIT } },
488 check_settings_smart_sizing_disabled,
489 {
"testfreerdp", DISABLED_DISPLAY_OPTIONS_RDP,
"/smart-sizing:off",
nullptr },
490 { WINPR_C_ARRAY_INIT } },
492 check_settings_multimon_force,
493 {
"testfreerdp",
"--multimon",
"force",
nullptr },
494 { WINPR_C_ARRAY_INIT } },
496 check_settings_smart_sizing_size,
497 {
"testfreerdp",
"--smart-sizing",
"1024x768",
nullptr },
498 { WINPR_C_ARRAY_INIT } },
499 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
500 check_settings_smartcard_no_redirection,
501 {
"testfreerdp",
"/multimon:garbage",
nullptr },
502 { WINPR_C_ARRAY_INIT } },
503 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
504 check_settings_smartcard_no_redirection,
505 {
"testfreerdp",
"/smart-sizing:garbage",
nullptr },
506 { WINPR_C_ARRAY_INIT } },
507 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
508 check_settings_smartcard_no_redirection,
509 {
"testfreerdp",
"/multimon:",
nullptr },
510 { WINPR_C_ARRAY_INIT } },
511 { COMMAND_LINE_ERROR_UNEXPECTED_VALUE,
512 check_settings_smartcard_no_redirection,
513 {
"testfreerdp",
"/smart-sizing:",
nullptr },
514 { WINPR_C_ARRAY_INIT } },
516 check_settings_multimon_enabled,
517 {
"testfreerdp",
"+multimon",
nullptr },
518 { WINPR_C_ARRAY_INIT } },
519#if defined(WITH_GFX_H264)
521 check_settings_gfx_without_h264,
522 {
"testfreerdp",
"/gfx:progressive,AVC420:off,AVC444:off",
"/network:auto",
523 "/v:test.freerdp.com",
nullptr },
524 { WINPR_C_ARRAY_INIT } },
526 check_settings_gfx_without_h264,
527 {
"testfreerdp",
"/network:auto",
"/gfx:progressive,AVC420:off,AVC444:off",
528 "/v:test.freerdp.com",
nullptr },
529 { WINPR_C_ARRAY_INIT } },
531 check_settings_network_auto_h264,
532 {
"testfreerdp",
"/network:auto",
"/v:test.freerdp.com",
nullptr },
533 { WINPR_C_ARRAY_INIT } },
536 check_settings_modem_with_fonts,
537 {
"testfreerdp",
"+fonts",
"/network:modem",
"/v:test.freerdp.com",
nullptr },
538 { WINPR_C_ARRAY_INIT } },
542static void check_modified_arguments(
const test* test,
char** command_line,
int* rc)
544 const char* expected_argument =
nullptr;
546 for (
int k = 0; (expected_argument = test->modified_arguments[k].expected_value); k++)
548 int index = test->modified_arguments[k].index;
549 char* actual_argument = command_line[index];
551 if (0 != strcmp(actual_argument, expected_argument))
554 printf(
"Failure: overridden argument %d is %s but it should be %s\n", index,
555 actual_argument, expected_argument);
556 (void)fflush(stdout);
562int TestClientCmdLine(
int argc,
char* argv[])
568 for (
size_t i = 0; i < ARRAYSIZE(tests); i++)
570 const test* current = &tests[i];
572 char** command_line = string_list_copy(current->command_line);
574 const int len = string_list_length((
const char*
const*)command_line);
575 if (!testcase(__func__, command_line, WINPR_ASSERTING_INT_CAST(
size_t, len),
576 current->expected_status, current->validate_settings,
577 current->setup_settings))
579 TEST_FAILURE(
"parsing arguments.\n");
583 check_modified_arguments(current, command_line, &failure);
587 string_list_print(stdout, (
const char*
const*)command_line);
591 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.