1#include <winpr/sysinfo.h>
3#include <winpr/crypto.h>
6#include <freerdp/freerdp.h>
7#include <freerdp/gdi/gdi.h>
8#include <freerdp/client/cmdline.h>
10static HANDLE s_sync =
nullptr;
12static int runInstance(
int argc,
char* argv[], freerdp** inst, DWORD timeout)
15 RDP_CLIENT_ENTRY_POINTS clientEntryPoints = WINPR_C_ARRAY_INIT;
16 rdpContext* context =
nullptr;
18 clientEntryPoints.Size =
sizeof(RDP_CLIENT_ENTRY_POINTS);
19 clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION;
20 clientEntryPoints.ContextSize =
sizeof(rdpClientContext);
21 context = freerdp_client_context_new(&clientEntryPoints);
27 *inst = context->instance;
29 context->instance->ChooseSmartcard =
nullptr;
30 context->instance->PresentGatewayMessage =
nullptr;
31 context->instance->LogonErrorInfo =
nullptr;
32 context->instance->AuthenticateEx =
nullptr;
33 context->instance->VerifyCertificateEx =
nullptr;
34 context->instance->VerifyChangedCertificateEx =
nullptr;
39 if (freerdp_client_settings_parse_command_line(context->settings, argc, argv, FALSE) < 0)
45 if (!freerdp_client_load_addins(context->channels, context->settings))
50 if (!SetEvent(s_sync))
56 if (!freerdp_connect(context->instance))
61 if (!freerdp_disconnect(context->instance))
66 freerdp_client_context_free(context);
72static int testTimeout(
int port)
74 const DWORD timeout = 200;
78 char arg1[] =
"/v:192.0.2.1:XXXXX";
79 char* argv[] = {
"test",
"/v:192.0.2.1:XXXXX" };
81 (void)_snprintf(arg1, 18,
"/v:192.0.2.1:%d", port);
83 start = GetTickCount();
84 rc = runInstance(ARRAYSIZE(argv), argv,
nullptr, timeout);
92 if (diff > 4 * timeout)
98 printf(
"%s: Success!\n", __func__);
106static int testMonitorScaleFactors(
void)
109 char* argv[] = {
"test",
"/v:127.0.0.1:1",
"/scale-desktop:200" };
110 RDP_CLIENT_ENTRY_POINTS clientEntryPoints = WINPR_C_ARRAY_INIT;
111 clientEntryPoints.Size =
sizeof(RDP_CLIENT_ENTRY_POINTS);
112 clientEntryPoints.Version = RDP_CLIENT_INTERFACE_VERSION;
113 clientEntryPoints.ContextSize =
sizeof(rdpClientContext);
114 rdpContext* context = freerdp_client_context_new(&clientEntryPoints);
119 if (freerdp_client_settings_parse_command_line(context->settings, ARRAYSIZE(argv), argv,
123 (void)freerdp_connect(context->instance);
127 freerdp_settings_get_pointer_array(context->settings, FreeRDP_MonitorDefArray, 0);
131 const UINT32 desktop =
133 const UINT32 device =
135 if ((monitor->attributes.desktopScaleFactor != desktop) ||
136 (monitor->attributes.deviceScaleFactor != device) || (desktop != 200))
138 printf(
"%s: monitor scale %" PRIu32
"/%" PRIu32
", expected %" PRIu32
"/%" PRIu32
"\n",
139 __func__, monitor->attributes.desktopScaleFactor,
140 monitor->attributes.deviceScaleFactor, desktop, device);
145 printf(
"%s: Success!\n", __func__);
148 freerdp_client_context_free(context);
158static DWORD WINAPI testThread(LPVOID arg)
160 char arg1[] =
"/v:192.0.2.1:XXXXX";
161 char* argv[] = {
"test",
"/v:192.0.2.1:XXXXX" };
163 struct testThreadArgs* args = arg;
164 (void)_snprintf(arg1, 18,
"/v:192.0.2.1:%d", args->port);
166 rc = runInstance(ARRAYSIZE(argv), argv, args->arg, 5000);
175static int testAbort(
int port)
181 HANDLE thread =
nullptr;
182 struct testThreadArgs args;
183 freerdp* instance =
nullptr;
184 s_sync = CreateEvent(
nullptr, TRUE, FALSE,
nullptr);
190 args.arg = &instance;
191 start = GetTickCount();
192 thread = CreateThread(
nullptr, 0, testThread, &args, 0,
nullptr);
196 (void)CloseHandle(s_sync);
201 (void)WaitForSingleObject(s_sync, INFINITE);
205 freerdp_abort_connect_context(instance->context);
207 if (!freerdp_shall_disconnect_context(instance->context))
209 (void)CloseHandle(s_sync);
210 (void)CloseHandle(thread);
216 status = WaitForSingleObject(thread, 20000);
217 end = GetTickCount();
218 (void)CloseHandle(s_sync);
219 (void)CloseHandle(thread);
225 printf(
"%s required %" PRIu32
"ms for the test\n", __func__, diff);
229 if (WAIT_OBJECT_0 != status)
232 printf(
"%s: Success!\n", __func__);
236static char* concatenate(
size_t count, ...)
239 va_list ap = WINPR_C_ARRAY_INIT;
241 rc = _strdup(va_arg(ap,
char*));
242 for (
size_t x = 1; x < count; x++)
244 const char* cur = va_arg(ap,
const char*);
245 char* tmp = GetCombinedPath(rc, cur);
253static BOOL prepare_certificates(
const char* path)
264 exe = concatenate(5, TESTING_OUTPUT_DIRECTORY,
"winpr",
"tools",
"makecert-cli",
265 "winpr-makecert" CMAKE_EXECUTABLE_SUFFIX);
269 char commandLine[] =
"-format crt -path . -n server";
270 rc = CreateProcessA(exe, commandLine,
nullptr,
nullptr, TRUE, 0,
nullptr, path, &si, &process);
274 status = WaitForSingleObject(process.hProcess, 30000);
275 if (status != WAIT_OBJECT_0)
279 (void)CloseHandle(process.hProcess);
280 (void)CloseHandle(process.hThread);
284static int testSuccess(
int port)
290 char arg1[] =
"/v:127.0.0.1:XXXXX";
291 char* clientArgs[] = {
"test",
"/v:127.0.0.1:XXXXX",
"/cert:ignore",
"/rfx",
nullptr };
292 char* commandLine =
nullptr;
293 size_t commandLineLen = 0;
295 char* path =
nullptr;
296 char* wpath =
nullptr;
297 char* exe = GetCombinedPath(TESTING_OUTPUT_DIRECTORY,
"server");
298 (void)_snprintf(arg1, 18,
"/v:127.0.0.1:%d", port);
299 clientArgs[1] = arg1;
304 path = GetCombinedPath(exe,
"Sample");
305 wpath = GetCombinedPath(exe,
"Sample");
312 exe = GetCombinedPath(path,
"sfreerdp-server" CMAKE_EXECUTABLE_SUFFIX);
317 printf(
"Sample Server: %s\n", exe);
318 printf(
"Workspace: %s\n", wpath);
320 if (!winpr_PathFileExists(exe))
323 if (!prepare_certificates(wpath))
327 commandLineLen = strlen(exe) + strlen(
"--port=XXXXX") + 1;
328 commandLine = malloc(commandLineLen);
333 (void)_snprintf(commandLine, commandLineLen,
"%s --port=%d", exe, port);
336 if (!CreateProcessA(
nullptr, commandLine,
nullptr,
nullptr, FALSE, 0,
nullptr, wpath, &si,
341 r = runInstance(argc, clientArgs,
nullptr, 10000);
343 if (!TerminateProcess(process.hProcess, 0))
346 (void)WaitForSingleObject(process.hProcess, INFINITE);
347 (void)CloseHandle(process.hProcess);
348 (void)CloseHandle(process.hThread);
349 printf(
"%s: returned %d!\n", __func__, r);
353 printf(
"%s: Success!\n", __func__);
363int TestConnect(
int argc,
char* argv[])
369 if (winpr_RAND(&random,
sizeof(random)) < 0)
371 randomPort = 3389 + (random % 200);
374 if (testMonitorScaleFactors())
379 if (testTimeout(randomPort))
384 if (testAbort(randomPort))
389 if (testSuccess(randomPort))
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.