3#include <winpr/assert.h>
4#include <winpr/tchar.h>
5#include <winpr/cmdline.h>
6#include <winpr/strlst.h>
8static const char* testArgv[] = {
"mstsc.exe",
18 "/valuelist:value1,value2",
22static const char testListAppName[] =
"test app name";
23static const char* testListArgs[] = {
24 "g:some.gateway.server,u:some\\\"user,p:some\\\"password,d:some\\\"domain,type:auto",
26 "a:,\"b:xxx, yyy\",c",
29 "\"a,b,c,d d d,fff\"",
39static const char* testListArgs1[] = { testListAppName,
"a",
"b",
"c",
"d" };
40static const char* testListArgs2[] = { testListAppName,
"a:",
"b:xxx, yyy",
"c" };
43static const char* testListArgs5[] = { testListAppName,
"a",
"b",
"c",
"d d d",
"fff" };
44static const char* testListArgs6[] = { testListAppName };
45static const char* testListArgs7[] = { testListAppName };
46static const char* testListArgs8[] = { testListAppName,
"a",
"b",
"\"",
"c" };
47static const char* testListArgs9[] = { testListAppName,
"a",
"b",
"'",
"c" };
50static const char* testListArgs12[] = { testListAppName,
"g:some.gateway.server",
51 "u:some\\\"user",
"p:some\\\"password",
52 "d:some\\\"domain",
"type:auto" };
54static const char** testListArgsResult[] = {
68static const size_t testListArgsCount[] = {
69 ARRAYSIZE(testListArgs12), ARRAYSIZE(testListArgs1),
70 ARRAYSIZE(testListArgs2), 0 ,
71 0 , ARRAYSIZE(testListArgs5),
72 ARRAYSIZE(testListArgs6), ARRAYSIZE(testListArgs7),
73 ARRAYSIZE(testListArgs8), ARRAYSIZE(testListArgs9),
78static BOOL checkResult(
size_t index,
char** actual,
size_t actualCount)
80 const char** result = testListArgsResult[index];
81 const size_t resultCount = testListArgsCount[index];
83 if (resultCount != actualCount)
88 return (actual == NULL);
95 for (
size_t x = 0; x < actualCount; x++)
97 const char* a = result[x];
98 const char* b = actual[x];
100 if (strcmp(a, b) != 0)
108static BOOL TestCommandLineParseCommaSeparatedValuesEx(
void)
110 WINPR_ASSERT(ARRAYSIZE(testListArgs) == ARRAYSIZE(testListArgsResult));
111 WINPR_ASSERT(ARRAYSIZE(testListArgs) == ARRAYSIZE(testListArgsCount));
113 for (
size_t x = 0; x < ARRAYSIZE(testListArgs); x++)
121 const char* list = testListArgs[x];
123 ptr.pp = CommandLineParseCommaSeparatedValuesEx(testListAppName, list, &count);
124 BOOL valid = checkResult(x, ptr.pp, count);
133int TestCmdLine(
int argc,
char* argv[])
142 char** command_line = NULL;
144 {
"v", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"destination server" },
145 {
"port", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"server port" },
146 {
"w", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"width" },
147 {
"h", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"height" },
148 {
"f", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL,
"fullscreen" },
149 {
"bpp", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
150 "session bpp (color depth)" },
151 {
"admin", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1,
"console",
152 "admin (or console) session" },
153 {
"multimon", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL,
"multi-monitor" },
154 {
"a", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1,
"addin",
"addin" },
155 {
"u", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"username" },
156 {
"p", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"password" },
157 {
"d", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"domain" },
158 {
"z", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
"compression" },
159 {
"audio", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"audio output mode" },
160 {
"mic", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL,
"audio input (microphone)" },
161 {
"fonts", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
162 "smooth fonts (cleartype)" },
163 {
"aero", COMMAND_LINE_VALUE_BOOL, NULL, NULL, BoolValueFalse, -1, NULL,
164 "desktop composition" },
165 {
"window-drag", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
166 "full window drag" },
167 {
"menu-anims", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
169 {
"themes", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
"themes" },
170 {
"wallpaper", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
"wallpaper" },
171 {
"codec", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
"codec" },
172 {
"nego", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
173 "protocol security negotiation" },
174 {
"sec", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
175 "force specific protocol security" },
176#if defined(WITH_FREERDP_DEPRECATED)
177 {
"sec-rdp", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
178 "rdp protocol security" },
179 {
"sec-tls", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
180 "tls protocol security" },
181 {
"sec-nla", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
182 "nla protocol security" },
183 {
"sec-ext", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
184 "nla extended protocol security" },
185 {
"cert-name", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
186 "certificate name" },
187 {
"cert-ignore", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL,
188 "ignore certificate" },
190 {
"valuelist", COMMAND_LINE_VALUE_REQUIRED,
"<val1>,<val2>", NULL, NULL, -1, NULL,
191 "List of comma separated values." },
192 {
"valuelist-empty", COMMAND_LINE_VALUE_REQUIRED,
"<val1>,<val2>", NULL, NULL, -1, NULL,
193 "List of comma separated values. Used to test correct behavior if an empty list was "
195 {
"version", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT_VERSION, NULL, NULL, NULL, -1,
196 NULL,
"print version" },
197 {
"help", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT_HELP, NULL, NULL, NULL, -1,
"?",
199 { NULL, 0, NULL, NULL, NULL, -1, NULL, NULL }
205 flags = COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SEPARATOR_COLON | COMMAND_LINE_SIGIL_PLUS_MINUS;
206 testArgc = string_list_length(testArgv);
207 command_line = string_list_copy(testArgv);
211 printf(
"Argument duplication failed (not enough memory?)\n");
215 status = CommandLineParseArgumentsA(testArgc, command_line, args, flags, NULL, NULL, NULL);
219 printf(
"CommandLineParseArgumentsA failure: %d\n", status);
223 arg = CommandLineFindArgumentA(args,
"w");
225 if (strcmp(
"1024", arg->Value) != 0)
227 printf(
"CommandLineFindArgumentA: unexpected %s value %s\n", arg->Name, arg->Value);
231 arg = CommandLineFindArgumentA(args,
"h");
233 if (strcmp(
"768", arg->Value) != 0)
235 printf(
"CommandLineFindArgumentA: unexpected %s value %s\n", arg->Name, arg->Value);
239 arg = CommandLineFindArgumentA(args,
"f");
243 printf(
"CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
247 arg = CommandLineFindArgumentA(args,
"admin");
251 printf(
"CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
255 arg = CommandLineFindArgumentA(args,
"multimon");
259 printf(
"CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
263 arg = CommandLineFindArgumentA(args,
"v");
265 if (strcmp(
"localhost:3389", arg->Value) != 0)
267 printf(
"CommandLineFindArgumentA: unexpected %s value %s\n", arg->Name, arg->Value);
271 arg = CommandLineFindArgumentA(args,
"fonts");
275 printf(
"CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
279 arg = CommandLineFindArgumentA(args,
"wallpaper");
283 printf(
"CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
287 arg = CommandLineFindArgumentA(args,
"help");
291 printf(
"CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
300 if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT))
303 printf(
"Argument: %s\n", arg->Name);
304 CommandLineSwitchStart(arg) CommandLineSwitchCase(arg,
"v")
307 CommandLineSwitchCase(arg,
"w")
309 width = strtol(arg->Value, NULL, 0);
314 CommandLineSwitchCase(arg,
"h")
316 height = strtol(arg->Value, NULL, 0);
321 CommandLineSwitchCase(arg,
"valuelist")
324 char** p = CommandLineParseCommaSeparatedValuesEx(arg->Name, arg->Value, &count);
327 if (!p || count != 3)
329 printf(
"CommandLineParseCommaSeparatedValuesEx: invalid p or count (%" PRIuz
335 CommandLineSwitchCase(arg,
"valuelist-empty")
338 char** p = CommandLineParseCommaSeparatedValuesEx(arg->Name, arg->Value, &count);
341 if (!p || count != 1)
343 printf(
"CommandLineParseCommaSeparatedValuesEx: invalid p or count (%" PRIuz
349 CommandLineSwitchDefault(arg)
352 CommandLineSwitchEnd(arg)
353 }
while ((arg = CommandLineFindNextArgumentA(arg)) != NULL);
355 if ((width != 1024) || (height != 768))
357 printf(
"Unexpected width and height: Actual: (%ldx%ld), Expected: (1024x768)\n", width,
364 string_list_free(command_line);
366 if (!TestCommandLineParseCommaSeparatedValuesEx())