From: Alistair Leslie-Hughes Subject: [v5 PATCH] dpnet/test: Add IDirectPlay8Client EnumHost tests Message-Id: Date: Fri, 18 Nov 2016 06:58:39 +0000 Using a Server object, so EnumHost will return a value. Once we have receive two records we safetly Cancel the EnumHost. Signed-off-by: Alistair Leslie-Hughes --- dlls/dpnet/tests/client.c | 143 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 3 deletions(-) diff --git a/dlls/dpnet/tests/client.c b/dlls/dpnet/tests/client.c index 4753d74..2b6bfb1 100644 --- a/dlls/dpnet/tests/client.c +++ b/dlls/dpnet/tests/client.c @@ -25,13 +25,49 @@ #include "wine/test.h" +static IDirectPlay8Server *server = NULL; static IDirectPlay8Client* client = NULL; static IDirectPlay8LobbiedApplication* lobbied = NULL; static const GUID appguid = { 0xcd0c3d4b, 0xe15e, 0x4cf2, { 0x9e, 0xa8, 0x6e, 0x1d, 0x65, 0x48, 0xc5, 0xa5 } }; +static HRESULT lastAsyncCode = E_FAIL; +static DPNHANDLE lastAsyncHandle = 0xdeadbeef; +static HANDLE enumevent = NULL; +static int handlecnt = 0; + +static HRESULT WINAPI DirectPlayServerHandler(void *context, DWORD message_id, void *buffer) +{ + switch(message_id) + { + case DPN_MSGID_CREATE_PLAYER: + case DPN_MSGID_DESTROY_PLAYER: + /* These are tested in the server test */ + break; + default: + trace("DirectPlayServerHandler: 0x%08x\n", message_id); + } + return S_OK; +} + static HRESULT WINAPI DirectPlayMessageHandler(PVOID context, DWORD message_id, PVOID buffer) { - trace("DirectPlayMessageHandler: 0x%08x\n", message_id); + switch(message_id) + { + case DPN_MSGID_ENUM_HOSTS_RESPONSE: + handlecnt++; + if(handlecnt >= 2) + SetEvent(enumevent); + break; + case DPN_MSGID_ASYNC_OP_COMPLETE: + { + DPNMSG_ASYNC_OP_COMPLETE *async_msg = (DPNMSG_ASYNC_OP_COMPLETE*)buffer; + lastAsyncCode = async_msg->hResultCode; + lastAsyncHandle = async_msg->hAsyncOp; + break; + } + default: + trace("DirectPlayMessageHandler: 0x%08x\n", message_id); + } return S_OK; } @@ -47,6 +83,37 @@ static HRESULT WINAPI DirectPlayLobbyClientMessageHandler(void *context, DWORD m return S_OK; } +static void create_server(void) +{ + static WCHAR sessionname[] = {'w','i','n','e','g','a','m','e','s','s','e','r','v','e','r',0}; + HRESULT hr; + IDirectPlay8Address *localaddr = NULL; + DPN_APPLICATION_DESC appdesc; + + hr = CoCreateInstance( &CLSID_DirectPlay8Server, NULL, CLSCTX_ALL, &IID_IDirectPlay8Server, (void **)&server); + ok(hr == S_OK, "Failed to create IDirectPlay8Server object\n"); + + hr = IDirectPlay8Server_Initialize(server, NULL, DirectPlayServerHandler, 0); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = CoCreateInstance( &CLSID_DirectPlay8Address, NULL, CLSCTX_ALL, &IID_IDirectPlay8Address, (void **)&localaddr); + ok(hr == S_OK, "Failed to create IDirectPlay8Address object\n"); + + hr = IDirectPlay8Address_SetSP(localaddr, &CLSID_DP8SP_TCPIP); + ok(hr == S_OK, "got 0x%08x\n", hr); + + memset( &appdesc, 0, sizeof(DPN_APPLICATION_DESC) ); + appdesc.dwSize = sizeof( DPN_APPLICATION_DESC ); + appdesc.dwFlags = DPNSESSION_CLIENT_SERVER; + appdesc.guidApplication = appguid; + appdesc.pwszSessionName = sessionname; + + hr = IDirectPlay8Server_Host(server, &appdesc, &localaddr, 1, NULL, NULL, NULL, 0); + todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); + + IDirectPlay8Address_Release(localaddr); +} + static BOOL test_init_dp(void) { HRESULT hr; @@ -56,6 +123,10 @@ static BOOL test_init_dp(void) hr = CoInitialize(0); ok(hr == S_OK, "CoInitialize failed with %x\n", hr); + enumevent = CreateEventA( NULL, TRUE, FALSE, NULL); + + create_server(); + hr = CoCreateInstance(&CLSID_DirectPlay8Client, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectPlay8Client, (void **)&client); ok(hr == S_OK, "CoCreateInstance failed with 0x%x\n", hr); @@ -144,16 +215,22 @@ static void test_enum_service_providers(void) static void test_enum_hosts(void) { HRESULT hr; + IDirectPlay8Client *client2; IDirectPlay8Address *host = NULL; IDirectPlay8Address *local = NULL; DPN_APPLICATION_DESC appdesc; - DPNHANDLE async = 0; + DPNHANDLE async = 0, async2 = 0; static const WCHAR localhost[] = {'1','2','7','.','0','.','0','.','1',0}; + DPN_SP_CAPS caps; + char *data; memset( &appdesc, 0, sizeof(DPN_APPLICATION_DESC) ); appdesc.dwSize = sizeof( DPN_APPLICATION_DESC ); appdesc.guidApplication = appguid; + hr = CoCreateInstance(&CLSID_DirectPlay8Client, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectPlay8Client, (void **)&client2); + ok(hr == S_OK, "CoCreateInstance failed with 0x%x\n", hr); + hr = CoCreateInstance( &CLSID_DirectPlay8Address, NULL, CLSCTX_ALL, &IID_IDirectPlay8Address, (LPVOID*)&local); ok(hr == S_OK, "IDirectPlay8Address failed with 0x%08x\n", hr); @@ -170,16 +247,69 @@ static void test_enum_hosts(void) DPNA_DATATYPE_STRING); ok(hr == S_OK, "IDirectPlay8Address failed with 0x%08x\n", hr); + caps.dwSize = sizeof(DPN_SP_CAPS); + + hr = IDirectPlay8Client_GetSPCaps(client, &CLSID_DP8SP_TCPIP, &caps, 0); + ok(hr == DPN_OK, "got %x\n", hr); + data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, caps.dwMaxEnumPayloadSize + 1); + + hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, 2, 1000, 1000, NULL, &async, DPNENUMHOSTS_SYNC); + todo_wine ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr); + + hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, data, caps.dwMaxEnumPayloadSize + 1, + INFINITE, 0, INFINITE, NULL, &async, DPNENUMHOSTS_SYNC); + todo_wine ok(hr == DPNERR_INVALIDPARAM, "got 0x%08x\n", hr); + + async = 0; + hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, data, caps.dwMaxEnumPayloadSize + 1, INFINITE, 0, + INFINITE, NULL, &async, 0); + todo_wine ok(hr == DPNERR_ENUMQUERYTOOLARGE, "got 0x%08x\n", hr); + ok(!async, "Handle returned\n"); + + async = 0; + hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, data, caps.dwMaxEnumPayloadSize, INFINITE, 0, INFINITE, + NULL, &async, 0); + todo_wine ok(hr == DPNSUCCESS_PENDING, "got 0x%08x\n", hr); + todo_wine ok(async, "No Handle returned\n"); + + /* This CancelAsyncOperation doesn't generate a DPN_MSGID_ASYNC_OP_COMPLETE */ + hr = IDirectPlay8Client_CancelAsyncOperation(client, async, 0); + ok(hr == S_OK, "got 0x%08x\n", hr); + HeapFree(GetProcessHeap(), 0, data); + + /* No Initialize has been called on client2. */ + hr = IDirectPlay8Client_EnumHosts(client2, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL, &async, 0); + todo_wine ok(hr == DPNERR_UNINITIALIZED, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr); + /* Since we are running asynchronously, EnumHosts returns DPNSUCCESS_PENDING. */ hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL, &async, 0); - todo_wine ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumServiceProviders failed with 0x%08x\n", hr); + todo_wine ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr); todo_wine ok(async, "No Handle returned\n"); + hr = IDirectPlay8Client_EnumHosts(client, &appdesc, host, local, NULL, 0, INFINITE, 0, INFINITE, NULL, &async2, 0); + todo_wine ok(hr == DPNSUCCESS_PENDING, "IDirectPlay8Client_EnumHosts failed with 0x%08x\n", hr); + todo_wine ok(async2, "No Handle returned\n"); + todo_wine ok(async2 != async, "Same handle returned.\n"); + + WaitForSingleObject( enumevent, 1000); + + lastAsyncCode = E_FAIL; + lastAsyncHandle = 0xdeadbeef; hr = IDirectPlay8Client_CancelAsyncOperation(client, async, 0); ok(hr == S_OK, "IDirectPlay8Client_CancelAsyncOperation failed with 0x%08x\n", hr); + todo_wine ok(lastAsyncCode == DPNERR_USERCANCEL, "got 0x%08x\n", lastAsyncCode); + todo_wine ok(lastAsyncHandle == async, "got 0x%08x\n", async); + + lastAsyncCode = E_FAIL; + lastAsyncHandle = 0xdeadbeef; + hr = IDirectPlay8Client_CancelAsyncOperation(client, async2, 0); + ok(hr == S_OK, "IDirectPlay8Client_CancelAsyncOperation failed with 0x%08x\n", hr); + todo_wine ok(lastAsyncCode == DPNERR_USERCANCEL, "got 0x%08x\n", lastAsyncCode); + todo_wine ok(lastAsyncHandle == async2, "got 0x%08x\n", async2); IDirectPlay8Address_Release(local); IDirectPlay8Address_Release(host); + IDirectPlay8Client_Release(client2); } static void test_get_sp_caps(void) @@ -316,6 +446,13 @@ static void test_cleanup_dp(void) IDirectPlay8Client_Release(client); + hr = IDirectPlay8Server_Close(server, 0); + todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); + + IDirectPlay8Server_Release(server); + + CloseHandle(enumevent); + CoUninitialize(); } -- 1.9.1