Blame client/common/test/TestClientCmdLine.c

Packit Service fa4841
#include <freerdp/client.h>
Packit Service fa4841
#include <freerdp/client/cmdline.h>
Packit Service fa4841
#include <freerdp/settings.h>
Packit Service fa4841
#include <winpr/cmdline.h>
Packit Service fa4841
#include <winpr/spec.h>
Packit Service fa4841
#include <winpr/strlst.h>
Packit Service fa4841
#include <winpr/collections.h>
Packit Service fa4841
Packit Service fa4841
typedef BOOL (*validate_settings_pr)(rdpSettings* settings);
Packit Service fa4841
Packit Service fa4841
#define printref() printf("%s:%d: in function %-40s:", __FILE__, __LINE__, __FUNCTION__)
Packit Service fa4841
Packit Service b1ea74
#define ERROR(format, ...)                      \
Packit Service b1ea74
	do                                          \
Packit Service b1ea74
	{                                           \
Packit Service b1ea74
		fprintf(stderr, format, ##__VA_ARGS__); \
Packit Service b1ea74
		printref();                             \
Packit Service b1ea74
		printf(format, ##__VA_ARGS__);          \
Packit Service b1ea74
		fflush(stdout);                         \
Packit Service b1ea74
	} while (0)
Packit Service b1ea74
Packit Service b1ea74
#define FAILURE(format, ...)           \
Packit Service b1ea74
	do                                 \
Packit Service b1ea74
	{                                  \
Packit Service b1ea74
		printref();                    \
Packit Service b1ea74
		printf(" FAILURE ");           \
Packit Service b1ea74
		printf(format, ##__VA_ARGS__); \
Packit Service b1ea74
		fflush(stdout);                \
Packit Service b1ea74
	} while (0)
Packit Service fa4841
Packit Service fa4841
static void print_test_title(int argc, char** argv)
Packit Service fa4841
{
Packit Service fa4841
	int i;
Packit Service fa4841
	printf("Running test:");
Packit Service fa4841
Packit Service b1ea74
	for (i = 0; i < argc; i++)
Packit Service fa4841
	{
Packit Service fa4841
		printf(" %s", argv[i]);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	printf("\n");
Packit Service fa4841
}
Packit Service fa4841
Packit Service b1ea74
static INLINE BOOL testcase(const char* name, char** argv, size_t argc, int expected_return,
Packit Service b1ea74
                            validate_settings_pr validate_settings)
Packit Service fa4841
{
Packit Service fa4841
	int status;
Packit Service fa4841
	BOOL valid_settings = TRUE;
Packit Service fa4841
	rdpSettings* settings = freerdp_settings_new(0);
Packit Service fa4841
	print_test_title(argc, argv);
Packit Service fa4841
Packit Service fa4841
	if (!settings)
Packit Service fa4841
	{
Packit Service fa4841
		ERROR("Test %s could not allocate settings!\n", name);
Packit Service fa4841
		return FALSE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	status = freerdp_client_settings_parse_command_line(settings, argc, argv, FALSE);
Packit Service fa4841
Packit Service fa4841
	if (validate_settings)
Packit Service fa4841
	{
Packit Service fa4841
		valid_settings = validate_settings(settings);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	freerdp_settings_free(settings);
Packit Service fa4841
Packit Service fa4841
	if (status == expected_return)
Packit Service fa4841
	{
Packit Service fa4841
		if (!valid_settings)
Packit Service fa4841
		{
Packit Service fa4841
			return FALSE;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
		FAILURE("Expected status %d,  got status %d\n", expected_return, status);
Packit Service fa4841
		return FALSE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return TRUE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
#if defined(_WIN32)
Packit Service fa4841
#define DRIVE_REDIRECT_PATH "c:\\Windows"
Packit Service fa4841
#else
Packit Service fa4841
#define DRIVE_REDIRECT_PATH "/tmp"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
static BOOL check_settings_smartcard_no_redirection(rdpSettings* settings)
Packit Service fa4841
{
Packit Service fa4841
	BOOL result = TRUE;
Packit Service fa4841
Packit Service fa4841
	if (settings->RedirectSmartCards)
Packit Service fa4841
	{
Packit Service fa4841
		FAILURE("Expected RedirectSmartCards = FALSE,  but RedirectSmartCards = TRUE!\n");
Packit Service fa4841
		result = FALSE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (freerdp_device_collection_find_type(settings, RDPDR_DTYP_SMARTCARD))
Packit Service fa4841
	{
Packit Service fa4841
		FAILURE("Expected no SMARTCARD device, but found at least one!\n");
Packit Service fa4841
		result = FALSE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return result;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
typedef struct
Packit Service fa4841
{
Packit Service fa4841
	int expected_status;
Packit Service fa4841
	validate_settings_pr validate_settings;
Packit Service fa4841
	const char* command_line[128];
Packit Service fa4841
	struct
Packit Service fa4841
	{
Packit Service fa4841
		int index;
Packit Service b1ea74
		const char* expected_value;
Packit Service fa4841
	} modified_arguments[8];
Packit Service fa4841
} test;
Packit Service fa4841
Packit Service b1ea74
static test tests[] = {
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT_HELP,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "--help", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT_HELP,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/help", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT_HELP,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "-help", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT_VERSION,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "--version", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT_VERSION,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/version", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT_VERSION,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "-version", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "-v", "test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "--v", "test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/v:test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "--plugin", "rdpsnd", "--plugin", "rdpdr", "--data",
Packit Service b1ea74
	    "disk:media:" DRIVE_REDIRECT_PATH, "--", "test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/sound", "/drive:media," DRIVE_REDIRECT_PATH, "/v:test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "-u", "test", "-p", "test", "test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 4, "****" }, { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "-u", "test", "-p", "test", "-v", "test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 4, "****" }, { 0 } } },
Packit Service b1ea74
	{ 0,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/u:test", "/p:test", "/v:test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 2, "/p:****" }, { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_ERROR_NO_KEYWORD,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "-invalid", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_ERROR_NO_KEYWORD,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "--invalid", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/kbd-list", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_STATUS_PRINT,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/monitor-list", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_ERROR,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/sound", "/drive:media:" DRIVE_REDIRECT_PATH, "/v:test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service b1ea74
	{ COMMAND_LINE_ERROR,
Packit Service b1ea74
	  check_settings_smartcard_no_redirection,
Packit Service b1ea74
	  { "testfreerdp", "/sound", "/drive:media,/foo/bar/blabla", "/v:test.freerdp.com", 0 },
Packit Service b1ea74
	  { { 0 } } },
Packit Service fa4841
Packit Service fa4841
#if 0
Packit Service fa4841
	{
Packit Service fa4841
		COMMAND_LINE_STATUS_PRINT, check_settings_smartcard_no_redirection,
Packit Service b1ea74
		{"testfreerdp", "-z", "--plugin", "cliprdr", "--plugin", "rdpsnd", "--data", "alsa", "latency:100", "--", "--plugin", "rdpdr", "--data", "disk:w7share:/home/w7share", "--", "--plugin", "drdynvc", "--data", "tsmf:decoder:gstreamer", "--", "-u", "test", "host.example.com", 0},
Packit Service fa4841
		{{0}}
Packit Service fa4841
	},
Packit Service fa4841
#endif
Packit Service fa4841
};
Packit Service fa4841
Packit Service fa4841
void check_modified_arguments(test* test, char** command_line, int* rc)
Packit Service fa4841
{
Packit Service fa4841
	int k;
Packit Service b1ea74
	const char* expected_argument;
Packit Service fa4841
Packit Service b1ea74
	for (k = 0; (expected_argument = test->modified_arguments[k].expected_value); k++)
Packit Service fa4841
	{
Packit Service fa4841
		int index = test->modified_arguments[k].index;
Packit Service fa4841
		char* actual_argument = command_line[index];
Packit Service fa4841
Packit Service fa4841
		if (0 != strcmp(actual_argument, expected_argument))
Packit Service fa4841
		{
Packit Service fa4841
			printref();
Packit Service b1ea74
			printf("Failure: overridden argument %d is %s but it should be %s\n", index,
Packit Service b1ea74
			       actual_argument, expected_argument);
Packit Service fa4841
			fflush(stdout);
Packit Service b1ea74
			*rc = -1;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
int TestClientCmdLine(int argc, char* argv[])
Packit Service fa4841
{
Packit Service fa4841
	int rc = 0;
Packit Service b1ea74
	size_t i;
Packit Service fa4841
Packit Service b1ea74
	WINPR_UNUSED(argc);
Packit Service b1ea74
	WINPR_UNUSED(argv);
Packit Service b1ea74
	for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
Packit Service fa4841
	{
Packit Service fa4841
		int failure = 0;
Packit Service fa4841
		char** command_line = string_list_copy(tests[i].command_line);
Packit Service fa4841
Packit Service b1ea74
		if (!testcase(__FUNCTION__, command_line,
Packit Service b1ea74
		              string_list_length((const char* const*)command_line),
Packit Service fa4841
		              tests[i].expected_status, tests[i].validate_settings))
Packit Service fa4841
		{
Packit Service fa4841
			FAILURE("parsing arguments.\n");
Packit Service fa4841
			failure = 1;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service b1ea74
		check_modified_arguments(&tests[i], command_line, &failure);
Packit Service fa4841
Packit Service fa4841
		if (failure)
Packit Service fa4841
		{
Packit Service b1ea74
			string_list_print(stdout, (const char* const*)command_line);
Packit Service fa4841
			rc = -1;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		string_list_free(command_line);
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return rc;
Packit Service fa4841
}