1#include <winpr/sysinfo.h>
3#include <winpr/crypto.h>
6#include <freerdp/version.h>
7#include <freerdp/freerdp.h>
8#include <freerdp/gdi/gdi.h>
9#include <freerdp/client/cmdline.h>
11static HANDLE s_sync =
nullptr;
14static int runInstance(
int argc,
char* argv[], freerdp** inst, DWORD timeout)
17 RDP_CLIENT_ENTRY_POINTS clientEntryPoints = WINPR_C_ARRAY_INIT;
18 rdpContext* context =
nullptr;
20 clientEntryPoints.Size =
sizeof(RDP_CLIENT_ENTRY_POINTS);
21 clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION;
22 clientEntryPoints.ContextSize =
sizeof(rdpClientContext);
23 context = freerdp_client_context_new(&clientEntryPoints);
29 *inst = context->instance;
31 context->instance->ChooseSmartcard =
nullptr;
32 context->instance->PresentGatewayMessage =
nullptr;
33 context->instance->LogonErrorInfo =
nullptr;
34 context->instance->AuthenticateEx =
nullptr;
35 context->instance->VerifyCertificateEx =
nullptr;
36 context->instance->VerifyChangedCertificateEx =
nullptr;
41 if (freerdp_client_settings_parse_command_line(context->settings, argc, argv, FALSE) < 0)
47 if (!freerdp_client_load_addins(context->channels, context->settings))
52 if (!SetEvent(s_sync))
58 if (!freerdp_connect(context->instance))
63 if (!freerdp_disconnect(context->instance))
68 freerdp_client_context_free(context);
75static int testTimeout(
int port)
77 const DWORD timeout = 200;
81 char arg1[] =
"/v:192.0.2.1:XXXXX";
82 char* argv[] = {
"test",
"/v:192.0.2.1:XXXXX" };
84 (void)_snprintf(arg1, 18,
"/v:192.0.2.1:%d", port);
86 start = GetTickCount();
87 rc = runInstance(ARRAYSIZE(argv), argv,
nullptr, timeout);
95 if (diff > 4 * timeout)
101 printf(
"%s: Success!\n", __func__);
110static int testMonitorScaleFactors(
void)
113 char* argv[] = {
"test",
"/v:127.0.0.1:1",
"/scale-desktop:200" };
114 RDP_CLIENT_ENTRY_POINTS clientEntryPoints = WINPR_C_ARRAY_INIT;
115 clientEntryPoints.Size =
sizeof(RDP_CLIENT_ENTRY_POINTS);
116 clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION;
117 clientEntryPoints.ContextSize =
sizeof(rdpClientContext);
118 rdpContext* context = freerdp_client_context_new(&clientEntryPoints);
123 if (freerdp_client_settings_parse_command_line(context->settings, ARRAYSIZE(argv), argv,
127 (void)freerdp_connect(context->instance);
131 freerdp_settings_get_pointer_array(context->settings, FreeRDP_MonitorDefArray, 0);
135 const UINT32 desktop =
137 const UINT32 device =
139 if ((monitor->attributes.desktopScaleFactor != desktop) ||
140 (monitor->attributes.deviceScaleFactor != device) || (desktop != 200))
142 printf(
"%s: monitor scale %" PRIu32
"/%" PRIu32
", expected %" PRIu32
"/%" PRIu32
"\n",
143 __func__, monitor->attributes.desktopScaleFactor,
144 monitor->attributes.deviceScaleFactor, desktop, device);
149 printf(
"%s: Success!\n", __func__);
152 freerdp_client_context_free(context);
163static DWORD WINAPI testThread(LPVOID arg)
165 char arg1[] =
"/v:192.0.2.1:XXXXX";
166 char* argv[] = {
"test",
"/v:192.0.2.1:XXXXX" };
168 struct testThreadArgs* args = arg;
169 (void)_snprintf(arg1, 18,
"/v:192.0.2.1:%d", args->port);
171 rc = runInstance(ARRAYSIZE(argv), argv, args->arg, 5000);
181static int testAbort(
int port)
187 HANDLE thread =
nullptr;
188 struct testThreadArgs args;
189 freerdp* instance =
nullptr;
190 s_sync = CreateEvent(
nullptr, TRUE, FALSE,
nullptr);
196 args.arg = &instance;
197 start = GetTickCount();
198 thread = CreateThread(
nullptr, 0, testThread, &args, 0,
nullptr);
202 (void)CloseHandle(s_sync);
207 (void)WaitForSingleObject(s_sync, INFINITE);
211 freerdp_abort_connect_context(instance->context);
213 if (!freerdp_shall_disconnect_context(instance->context))
215 (void)CloseHandle(s_sync);
216 (void)CloseHandle(thread);
222 status = WaitForSingleObject(thread, 20000);
223 end = GetTickCount();
224 (void)CloseHandle(s_sync);
225 (void)CloseHandle(thread);
231 printf(
"%s required %" PRIu32
"ms for the test\n", __func__, diff);
235 if (WAIT_OBJECT_0 != status)
238 printf(
"%s: Success!\n", __func__);
242WINPR_ATTR_MALLOC(free, 1)
243static
char* concatenate(
size_t count, ...)
246 va_list ap = WINPR_C_ARRAY_INIT;
248 rc = _strdup(va_arg(ap,
char*));
249 for (
size_t x = 1; x < count; x++)
251 const char* cur = va_arg(ap,
const char*);
252 char* tmp = GetCombinedPath(rc, cur);
261static BOOL prepare_certificates(
const char* path)
272 const char makecert[] =
"winpr-makecert"
273#if defined(WITH_BINARY_VERSIONING)
276 CMAKE_EXECUTABLE_SUFFIX;
278 exe = concatenate(5, TESTING_OUTPUT_DIRECTORY,
"winpr",
"tools",
"makecert-cli", makecert);
282 char commandLine[] =
"-format crt -path . -n server";
283 printf(
"[%s]: %s %s\n", __func__, exe, commandLine);
284 rc = CreateProcessA(exe, commandLine,
nullptr,
nullptr, TRUE, 0,
nullptr, path, &si, &process);
288 status = WaitForSingleObject(process.hProcess, 30000);
289 if (status != WAIT_OBJECT_0)
293 (void)CloseHandle(process.hProcess);
294 (void)CloseHandle(process.hThread);
299static int testSuccess(
int port)
305 char arg1[] =
"/v:127.0.0.1:XXXXX";
306 char* clientArgs[] = {
"test",
"/v:127.0.0.1:XXXXX",
"/cert:ignore",
"/rfx",
nullptr };
307 char* commandLine =
nullptr;
308 size_t commandLineLen = 0;
310 char* path =
nullptr;
311 char* wpath =
nullptr;
312 char* exe = GetCombinedPath(TESTING_OUTPUT_DIRECTORY,
"server");
313 (void)_snprintf(arg1, 18,
"/v:127.0.0.1:%d", port);
314 clientArgs[1] = arg1;
319 path = GetCombinedPath(exe,
"Sample");
320 wpath = GetCombinedPath(exe,
"Sample");
327 const char srvexe[] =
"sfreerdp-server"
328#if defined(WITH_BINARY_VERSIONING)
331 CMAKE_EXECUTABLE_SUFFIX;
332 exe = GetCombinedPath(path, srvexe);
337 printf(
"Sample Server: %s\n", exe);
338 printf(
"Workspace: %s\n", wpath);
340 if (!winpr_PathFileExists(exe))
342 (void)fprintf(stderr,
"[%s]: winpr_PathFileExists(%s) failed\n", __func__, exe);
346 if (!prepare_certificates(wpath))
348 (void)fprintf(stderr,
"[%s]: prepare_certificates(%s) failed\n", __func__, wpath);
353 commandLineLen = strlen(exe) + strlen(
"--port=XXXXX") + 1;
354 commandLine = malloc(commandLineLen);
359 (void)_snprintf(commandLine, commandLineLen,
"%s --port=%d", exe, port);
362 printf(
"Createing process with '%s'\n", commandLine);
363 if (!CreateProcessA(
nullptr, commandLine,
nullptr,
nullptr, FALSE, 0,
nullptr, wpath, &si,
366 (void)fprintf(stderr,
"[%s]: CreateProcess failed\n", __func__);
371 r = runInstance(argc, clientArgs,
nullptr, 10000);
373 if (!TerminateProcess(process.hProcess, 0))
375 (void)fprintf(stderr,
"[%s]: TerminateProcess failed\n", __func__);
379 (void)WaitForSingleObject(process.hProcess, INFINITE);
380 (void)CloseHandle(process.hProcess);
381 (void)CloseHandle(process.hThread);
382 printf(
"%s: returned %d!\n", __func__, r);
386 printf(
"%s: Success!\n", __func__);
396int TestConnect(
int argc,
char* argv[])
402 if (winpr_RAND(&random,
sizeof(random)) < 0)
404 (void)fprintf(stderr,
"winpr_RAND failed\n");
408 randomPort = 3389 + (random % 200);
411 if (testMonitorScaleFactors())
413 (void)fprintf(stderr,
"testMonitorScaleFactors failed\n");
419 if (testTimeout(randomPort))
421 (void)fprintf(stderr,
"testTimeout failed\n");
427 if (testAbort(randomPort))
429 (void)fprintf(stderr,
"testAbort failed\n");
435 if (testSuccess(randomPort))
437 (void)fprintf(stderr,
"testSuccess failed\n");
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_bool(rdpSettings *settings, FreeRDP_Settings_Keys_Bool id, BOOL val)
Sets a BOOL settings value.
WINPR_ATTR_NODISCARD FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 val)
Sets a UINT32 settings value.
WINPR_ATTR_NODISCARD FREERDP_API UINT32 freerdp_settings_get_uint32(const rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id)
Returns a UINT32 settings value.