From: Anton Baskanov baskanov@gmail.com
Fixes test failures on native. --- dlls/dplayx/tests/dplayx.c | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 0785b6535f1..0319513aa14 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2248,6 +2248,11 @@ static void check_Open_( int line, IDirectPlay4A *dp, DPSESSIONDESC2 *dpsd, cons checkHR( DP_OK, hr ); } } + else + { + hr = openAsyncWait( param, 7000 ); + ok_( __FILE__, line )( hr == expectedHr, "Open() returned %#lx.\n", hr ); + } closesocket( sendSock ); closesocket( recvSock ); }
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/tests/dplayx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 0319513aa14..1434a7e2d1f 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2211,16 +2211,16 @@ static void check_Open_( int line, IDirectPlay4A *dp, DPSESSIONDESC2 *dpsd, cons
sendSock = connectTcp_( line, port );
- sendRequestPlayerReply( sendSock, port, 0x12345678, idReplyHr ); + sendRequestPlayerReply_( line, sendSock, port, 0x12345678, idReplyHr );
if ( forwardRequestExpected ) { receiveAddForwardRequest_( line, recvSock, 0x12345678, expectedPassword, serverDpsd->dwReserved1 );
if ( addForwardReplyHr == DP_OK ) - sendSuperEnumPlayersReply( sendSock, port, 2399, serverDpsd, L"normal" ); + sendSuperEnumPlayersReply_( line, sendSock, port, 2399, serverDpsd, L"normal" ); else - sendAddForwardReply( sendSock, 2349, addForwardReplyHr ); + sendAddForwardReply_( line, sendSock, 2349, addForwardReplyHr );
hr = openAsyncWait( param, 7000 ); ok_( __FILE__, line )( hr == expectedHr, "Open() returned %#lx.\n", hr );
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/tests/dplayx.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 1434a7e2d1f..194fca32a8b 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -2176,12 +2176,12 @@ static void checkPlayerList_( int line, IDirectPlay4 *dp, ExpectedPlayer *expect data.actualPlayerCount ); }
-#define check_Open( dp, dpsd, serverDpsd, idRequestExpected, forwardRequestExpected, port, expectedPassword, \ +#define check_Open( dp, dpsd, serverDpsd, idRequestExpected, forwardRequestExpected, listenPort, expectedPassword, \ idReplyHr, addForwardReplyHr, expectedHr ) \ - check_Open_( __LINE__, dp, dpsd, serverDpsd, idRequestExpected, forwardRequestExpected, port, expectedPassword, \ + check_Open_( __LINE__, dp, dpsd, serverDpsd, idRequestExpected, forwardRequestExpected, listenPort, expectedPassword, \ idReplyHr, addForwardReplyHr, expectedHr ) static void check_Open_( int line, IDirectPlay4A *dp, DPSESSIONDESC2 *dpsd, const DPSESSIONDESC2 *serverDpsd, - BOOL idRequestExpected, BOOL forwardRequestExpected, unsigned short port, + BOOL idRequestExpected, BOOL forwardRequestExpected, unsigned short listenPort, const WCHAR *expectedPassword, HRESULT idReplyHr, HRESULT addForwardReplyHr, HRESULT expectedHr ) { @@ -2196,7 +2196,7 @@ static void check_Open_( int line, IDirectPlay4A *dp, DPSESSIONDESC2 *dpsd, cons wsResult = WSAStartup( MAKEWORD( 2, 0 ), &wsaData ); ok_( __FILE__, line )( !wsResult, "WSAStartup() returned %d.\n", wsResult );
- listenSock = listenTcp_( line, port ); + listenSock = listenTcp_( line, listenPort );
param = openAsync( dp, dpsd, DPOPEN_JOIN );
@@ -2211,16 +2211,16 @@ static void check_Open_( int line, IDirectPlay4A *dp, DPSESSIONDESC2 *dpsd, cons
sendSock = connectTcp_( line, port );
- sendRequestPlayerReply_( line, sendSock, port, 0x12345678, idReplyHr ); + sendRequestPlayerReply_( line, sendSock, listenPort, 0x12345678, idReplyHr );
if ( forwardRequestExpected ) { receiveAddForwardRequest_( line, recvSock, 0x12345678, expectedPassword, serverDpsd->dwReserved1 );
if ( addForwardReplyHr == DP_OK ) - sendSuperEnumPlayersReply_( line, sendSock, port, 2399, serverDpsd, L"normal" ); + sendSuperEnumPlayersReply_( line, sendSock, listenPort, 2399, serverDpsd, L"normal" ); else - sendAddForwardReply_( line, sendSock, 2349, addForwardReplyHr ); + sendAddForwardReply_( line, sendSock, listenPort, addForwardReplyHr );
hr = openAsyncWait( param, 7000 ); ok_( __FILE__, line )( hr == expectedHr, "Open() returned %#lx.\n", hr );
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/dplay.c | 1 - 1 file changed, 1 deletion(-)
diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c index 83970be9c41..421bd6f4951 100644 --- a/dlls/dplayx/dplay.c +++ b/dlls/dplayx/dplay.c @@ -400,7 +400,6 @@ HRESULT DP_HandleMessage( IDirectPlayImpl *This, const void *lpcMessageBody,
default: FIXME( "Unknown wCommandId %u. Ignoring message\n", wCommandId ); - DebugBreak(); break; }
From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/tests/dplayx.c | 206 +++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 194fca32a8b..5b90809d644 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -875,6 +875,24 @@ typedef struct HRESULT result; } AddForwardReply;
+typedef struct +{ + MessageHeader header; + DPID toId; + DPID playerId; + DPID groupId; + DWORD createOffset; + DWORD passwordOffset; + PackedPlayer playerInfo; + SpData spData; +} AddForward; + +typedef struct +{ + MessageHeader header; + DPID playerId; +} AddForwardAck; + #include "poppack.h"
#define bindUdp( port ) bindUdp_( __LINE__, port ) @@ -1456,6 +1474,95 @@ static void sendAddForwardReply_( int line, SOCKET sock, unsigned short port, HR ok_( __FILE__, line )( wsResult == sizeof( reply ), "send() returned %d.\n", wsResult ); }
+#define sendAddForward( sock, port, tcpPort, udpPort ) sendAddForward_( __LINE__, sock, port, tcpPort, udpPort ) +static void sendAddForward_( int line, SOCKET sock, unsigned short port, unsigned short tcpPort, unsigned short udpPort ) +{ + struct + { + SpHeader spHeader; + AddForward reply; + } reply = + { + .spHeader = + { + .mixed = 0xfab00000 + sizeof( reply ), + .addr = + { + .sin_family = AF_INET, + .sin_port = htons( port ), + }, + }, + .reply = + { + .header = + { + .magic = 0x79616c70, + .command = 46, + .version = 14, + }, + .toId = 0, + .playerId = 0x07734, + .groupId = 0, + .createOffset = 28, + .passwordOffset = 0, + .playerInfo = + { + .size = 48 + sizeof( SpData ), + .flags = 0x5, + .id = 0x07734, + .shortNameLength = 0, + .longNameLength = 0, + .spDataSize = sizeof( SpData ), + .playerDataSize = 0, + .playerCount = 0, + .systemPlayerId = 0x07734, + .fixedSize = 48, + .playerVersion = 14, + .parentId = 0, + }, + .spData = { + .tcpAddr = + { + .sin_family = AF_INET, + .sin_port = htons( tcpPort ), + }, + .udpAddr = + { + .sin_family = AF_INET, + .sin_port = htons( udpPort ), + }, + }, + }, + }; + + int wsResult; + + wsResult = send( sock, (char *) &reply, sizeof( reply ), 0 ); + ok_( __FILE__, line )( wsResult == sizeof( reply ), "send() returned %d.\n", wsResult ); +} + +#define receiveAddForwardAck( sock, expectedPlayerId ) receiveAddForwardAck_( __LINE__, sock, expectedPlayerId ) +static unsigned short receiveAddForwardAck_( int line, SOCKET sock, DPID expectedPlayerId ) +{ + struct + { + SpHeader spHeader; + AddForwardAck request; + } request; + unsigned short port; + int wsResult; + + wsResult = receiveMessage_( line, sock, &request, sizeof( request ) ); + todo_wine ok_( __FILE__, line )( wsResult == sizeof( request ), "recv() returned %d.\n", wsResult ); + if ( wsResult == SOCKET_ERROR ) + return 0; + + port = checkSpHeader_( line, &request.spHeader, sizeof( request ), FALSE ); + checkMessageHeader_( line, &request.request.header, 47 ); + + return port; +} + static void init_TCPIP_provider( IDirectPlay4 *pDP, LPCSTR strIPAddressString, WORD port ) {
@@ -2567,6 +2674,104 @@ static void test_interactive_Open(void)
}
+#define joinSession( dp, dpsd, serverDpsd, sendSock, recvSock ) \ + joinSession_( __LINE__, dp, dpsd, serverDpsd, sendSock, recvSock ) +static void joinSession_( int line, IDirectPlay4 *dp, DPSESSIONDESC2 *dpsd, DPSESSIONDESC2 *serverDpsd, + SOCKET *sendSock, SOCKET *recvSock ) +{ + EnumSessionsParam *enumSessionsParam; + OpenParam *openParam; + unsigned short port; + SOCKET listenSock; + SOCKET enumSock; + int tryIndex; + HRESULT hr; + + enumSock = bindUdp_( line, 47624 ); + + listenSock = listenTcp_( line, 2349 ); + + for ( tryIndex = 0; ; ++tryIndex ) + { + int count = 0; + + enumSessionsParam = enumSessionsAsync( dp, dpsd, 100, countSessionsCallback, &count, 0 ); + + port = receiveEnumSessionsRequest_( line, enumSock, &appGuid, NULL, 0 ); + + *sendSock = connectTcp_( line, port ); + + sendEnumSessionsReply_( line, *sendSock, 2349, serverDpsd ); + + hr = enumSessionsAsyncWait( enumSessionsParam, 2000 ); + ok_( __FILE__, line )( hr == DP_OK, "EnumSessions() returned %#lx.\n", hr ); + + if ( tryIndex < 19 && count < 1 ) + continue; + + ok( count == 1, "got session count %d.\n", count ); + + break; + } + + openParam = openAsync( dp, dpsd, DPOPEN_JOIN ); + + *recvSock = acceptTcp_( line, listenSock ); + ok_( __FILE__, line )( *recvSock != INVALID_SOCKET, "accept() returned %#Ix.\n", *recvSock ); + + receiveRequestPlayerId_( line, *recvSock, 0x9 ); + sendRequestPlayerReply_( line, *sendSock, 2349, 0x12345678, DP_OK ); + receiveAddForwardRequest_( line, *recvSock, 0x12345678, L"", serverDpsd->dwReserved1 ); + sendSuperEnumPlayersReply_( line, *sendSock, 2349, 2399, serverDpsd, L"normal" ); + checkNoMoreMessages_( line, *recvSock ); + + checkNoMoreAccepts_( line, listenSock ); + + hr = openAsyncWait( openParam, 2000 ); + ok_( __FILE__, line )( hr == DP_OK, "Open() returned %#lx.\n", hr ); + + closesocket( listenSock ); + closesocket( enumSock ); +} + +static void test_ADDFORWARD(void) +{ + DPSESSIONDESC2 appGuidDpsd = + { + .dwSize = sizeof( DPSESSIONDESC2 ), + .guidInstance = appGuid, + .guidApplication = appGuid, + }; + DPSESSIONDESC2 serverDpsd = + { + .dwSize = sizeof( DPSESSIONDESC2 ), + .guidApplication = appGuid, + .guidInstance = appGuid, + .lpszSessionName = (WCHAR *) L"normal", + .dwReserved1 = 0xaabbccdd, + }; + IDirectPlay4A *dp; + SOCKET sendSock; + SOCKET recvSock; + HRESULT hr; + + hr = CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectPlay4A, (void **) &dp ); + ok( hr == DP_OK, "got hr %#lx.\n", hr ); + + init_TCPIP_provider( dp, "127.0.0.1", 0 ); + + joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock ); + + sendAddForward( sendSock, 2349, 2348, 2398 ); + receiveAddForwardAck( recvSock, 0x07734 ); + checkNoMoreMessages( recvSock ); + + closesocket( recvSock ); + closesocket( sendSock ); + + IDirectPlayX_Release( dp ); +} + /* EnumSessions */
static BOOL CALLBACK EnumSessions_cb( LPCDPSESSIONDESC2 lpThisSD, @@ -8527,6 +8732,7 @@ START_TEST(dplayx) test_EnumAddressTypes(); test_EnumSessions(); test_Open(); + test_ADDFORWARD();
if (!winetest_interactive) {
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=148961
Your paranoid android.
=== debian11 (32 bit hi:IN report) ===
dplayx: dplayx.c:2540: Test failed: got mixed 0xfab00086. dplayx.c:2540: Test failed: recv() returned 6. dplayx.c:2540: Test failed: got password L"". dplayx.c:2540: Test failed: recv() returned -1. dplayx.c:2540: Test failed: got tick count 0xcccccccc.
This merge request was approved by Alistair Leslie-Hughes.