From: Anton Baskanov baskanov@gmail.com
--- dlls/dplayx/tests/dplayx.c | 109 +++++++++++++++++++++++++++++++------ 1 file changed, 92 insertions(+), 17 deletions(-)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 6c535c97cb8..5ddb7e3a5e8 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -1081,6 +1081,25 @@ static SOCKET connectTcp_( int line, unsigned short port ) return sock; }
+#define connectUdp( port ) connectUdp_( __LINE__, port) +static SOCKET connectUdp_( int line, unsigned short port ) +{ + SOCKADDR_IN addr; + int wsResult; + SOCKET sock; + + sock = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); + ok_( __FILE__, line)( sock != INVALID_SOCKET, "got send socket %#Ix.\n", sock ); + + addr.sin_family = AF_INET; + addr.sin_port = htons( port ); + addr.sin_addr.s_addr = htonl( INADDR_LOOPBACK ); + wsResult = connect( sock, (SOCKADDR *) &addr, sizeof( addr ) ); + ok_( __FILE__, line)( !wsResult, "connect returned %d.\n", wsResult ); + + return sock; +} + #define receiveMessage( sock, buffer, size ) receiveMessage_( __LINE__, sock, buffer, size ) static int receiveMessage_( int line, SOCKET sock, void *buffer, int size ) { @@ -1139,8 +1158,8 @@ static void checkMessageHeader_( int line, MessageHeader *header, WORD expectedC ok_( __FILE__, line )( header->command == expectedCommand, "got command %d.\n", header->command ); }
-#define checkSpData( spData ) checkSpData_( __LINE__, spData ) -static void checkSpData_( int line, SpData *spData ) +#define checkSpData( spData ) checkSpData_( __LINE__, spData, udpPort ) +static void checkSpData_( int line, SpData *spData, unsigned short *udpPort ) { ok_( __FILE__, line )( spData->tcpAddr.sin_family == AF_INET, "got TCP family %d.\n", spData->tcpAddr.sin_family ); ok_( __FILE__, line )( 2300 <= ntohs( spData->tcpAddr.sin_port ) && ntohs( spData->tcpAddr.sin_port ) < 2350, @@ -1152,6 +1171,9 @@ static void checkSpData_( int line, SpData *spData ) "got UDP port %d.\n", ntohs( spData->udpAddr.sin_port ) ); ok_( __FILE__, line )( !spData->udpAddr.sin_addr.s_addr, "got UDP address %#lx.\n", spData->udpAddr.sin_addr.s_addr ); + + if ( udpPort ) + *udpPort = ntohs( spData->udpAddr.sin_port ); }
#define checkPackedPlayer( player, expectedFlags, expectedId, expectedShortNameLength, expectedLongNameLength, \ @@ -1339,10 +1361,11 @@ static void sendRequestPlayerReply_( int line, SOCKET sock, unsigned short port, ok_( __FILE__, line )( wsResult == sizeof( reply ), "send() returned %d.\n", wsResult ); }
-#define receiveAddForwardRequest( sock, expectedPlayerId, expectedPassword, expectedTickCount ) \ - receiveAddForwardRequest_( __LINE__, sock, expectedPlayerId, expectedPassword, expectedTickCount ) +#define receiveAddForwardRequest( sock, expectedPlayerId, expectedPassword, expectedTickCount, udpPort ) \ + receiveAddForwardRequest_( __LINE__, sock, expectedPlayerId, expectedPassword, expectedTickCount, udpPort ) static unsigned short receiveAddForwardRequest_( int line, SOCKET sock, DPID expectedPlayerId, - const WCHAR *expectedPassword, DWORD expectedTickCount ) + const WCHAR *expectedPassword, DWORD expectedTickCount, + unsigned short *udpPort ) { struct { @@ -1375,7 +1398,7 @@ static unsigned short receiveAddForwardRequest_( int line, SOCKET sock, DPID exp ok_( __FILE__, line )( request.request.passwordOffset == 108, "got password offset %lu.\n", request.request.passwordOffset ); checkPackedPlayer_( line, &request.request.playerInfo, 0x9, expectedPlayerId, 0, 0, 0, expectedPlayerId ); - checkSpData_( line, &request.request.spData ); + checkSpData_( line, &request.request.spData, udpPort );
wsResult = receiveMessage_( line, sock, password, expectedPasswordSize );
@@ -1716,7 +1739,7 @@ static unsigned short receiveCreatePlayer_( int line, SOCKET sock, DPID expected
wsResult = receiveMessage_( line, sock, &spData, sizeof( spData ) ); ok_( __FILE__, line )( wsResult == sizeof( spData ), "recv() returned %d.\n", wsResult ); - checkSpData_( line, &spData ); + checkSpData_( line, &spData, NULL );
if ( expectedPlayerDataSize ) { @@ -1924,6 +1947,33 @@ static void sendGuaranteedGameMessage_( int line, SOCKET sock, unsigned short po ok_( __FILE__, line )( wsResult == dataSize, "send() returned %d.\n", wsResult ); }
+#define sendGameMessage( sock, fromId, toId, data, dataSize ) \ + sendGameMessage_( __LINE__, sock, fromId, toId, data, dataSize ) +static void sendGameMessage_( int line, SOCKET sock, DPID fromId, DPID toId, void *data, DWORD dataSize ) +{ + struct + { + GameMessage request; + BYTE data[ 256 ]; + } request = + { + .request = + { + .fromId = fromId, + .toId = toId, + } + }; + int wsResult; + DWORD size; + + size = sizeof( request.request ) + dataSize; + + memcpy( request.data, data, dataSize ); + + wsResult = send( sock, (char *) &request, size, 0 ); + ok_( __FILE__, line )( wsResult == size, "send() returned %d.\n", wsResult ); +} + static void init_TCPIP_provider( IDirectPlay4 *pDP, LPCSTR strIPAddressString, WORD port ) {
@@ -2775,7 +2825,7 @@ static void check_Open_( int line, IDirectPlay4A *dp, DPSESSIONDESC2 *dpsd, cons
if ( forwardRequestExpected ) { - receiveAddForwardRequest_( line, recvSock, 0x12345678, expectedPassword, serverDpsd->dwReserved1 ); + receiveAddForwardRequest_( line, recvSock, 0x12345678, expectedPassword, serverDpsd->dwReserved1, NULL );
if ( addForwardReplyHr == DP_OK ) sendSuperEnumPlayersReply_( line, sendSock, listenPort, 2399, serverDpsd, L"normal" ); @@ -3127,10 +3177,10 @@ static void test_interactive_Open(void)
}
-#define joinSession( dp, dpsd, serverDpsd, sendSock, recvSock ) \ - joinSession_( __LINE__, dp, dpsd, serverDpsd, sendSock, recvSock ) +#define joinSession( dp, dpsd, serverDpsd, sendSock, recvSock, udpPort ) \ + joinSession_( __LINE__, dp, dpsd, serverDpsd, sendSock, recvSock, udpPort ) static void joinSession_( int line, IDirectPlay4 *dp, DPSESSIONDESC2 *dpsd, DPSESSIONDESC2 *serverDpsd, - SOCKET *sendSock, SOCKET *recvSock ) + SOCKET *sendSock, SOCKET *recvSock, unsigned short *udpPort ) { EnumSessionsParam *enumSessionsParam; OpenParam *openParam; @@ -3174,7 +3224,7 @@ static void joinSession_( int line, IDirectPlay4 *dp, DPSESSIONDESC2 *dpsd, DPSE
receiveRequestPlayerId_( line, *recvSock, 0x9 ); sendRequestPlayerReply_( line, *sendSock, 2349, 0x12345678, DP_OK ); - receiveAddForwardRequest_( line, *recvSock, 0x12345678, L"", serverDpsd->dwReserved1 ); + receiveAddForwardRequest_( line, *recvSock, 0x12345678, L"", serverDpsd->dwReserved1, udpPort ); sendSuperEnumPlayersReply_( line, *sendSock, 2349, 2399, serverDpsd, L"normal" ); checkNoMoreMessages_( line, *recvSock );
@@ -3213,7 +3263,7 @@ static void test_ADDFORWARD(void)
init_TCPIP_provider( dp, "127.0.0.1", 0 );
- joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock ); + joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock, NULL );
sendAddForward( sendSock, 2349, 2348, 2398 ); receiveAddForwardAck( recvSock, 0x07734 ); @@ -4526,7 +4576,7 @@ static void test_CreatePlayer(void) NULL, NULL, 0 );
/* Join to normal session */ - joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock ); + joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock, NULL );
/* Player name */ dpid = 0xdeadbeef; @@ -4789,7 +4839,7 @@ static void test_CREATEPLAYER(void)
init_TCPIP_provider( dp, "127.0.0.1", 0 );
- joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock ); + joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock, NULL );
createPlayer( dp, 0x11223344, event, NULL, 0, 0, sendSock, recvSock );
@@ -7729,7 +7779,7 @@ static void test_Send(void) hr = IDirectPlayX_Send( dp, 0x07734, 0x1337, DPSEND_GUARANTEED, data, sizeof( data ) ); ok( hr == DPERR_INVALIDPLAYER, "got hr %#lx.\n", hr );
- joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock ); + joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock, NULL );
createPlayer( dp, 0x07734, NULL, NULL, 0, 0, sendSock, recvSock ); createPlayer( dp, 0x14, NULL, NULL, 0, 0, sendSock, recvSock ); @@ -8134,6 +8184,7 @@ static void test_Receive(void) }; BYTE data0[] = { 1, 2, 3, 4, 5, 6, 7, 8, }; BYTE data1[] = { 4, 3, 2, 1, }; + unsigned short udpPort; BYTE msgData[ 256 ]; DWORD msgDataSize; DPID fromId, toId; @@ -8141,6 +8192,7 @@ static void test_Receive(void) IDirectPlay4 *dp; SOCKET sendSock; SOCKET recvSock; + SOCKET udpSock; HANDLE event0; HANDLE event1; HRESULT hr; @@ -8161,7 +8213,7 @@ static void test_Receive(void) hr = IDirectPlayX_Receive( dp, &fromId, &toId, 0, msgData, &msgDataSize ); ok( hr == DPERR_NOMESSAGES, "got hr %#lx.\n", hr );
- joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock ); + joinSession( dp, &appGuidDpsd, &serverDpsd, &sendSock, &recvSock, &udpPort );
createPlayer( dp, 0x07734, event0, NULL, 0, 0, sendSock, recvSock ); createPlayer( dp, 0x14, event1, NULL, 0, 0, sendSock, recvSock ); @@ -8312,6 +8364,29 @@ static void test_Receive(void) hr = IDirectPlayX_Receive( dp, &fromId, &toId, DPRECEIVE_TOPLAYER, msgData, &msgDataSize ); ok( hr == DPERR_NOMESSAGES, "got hr %#lx.\n", hr );
+ udpSock = connectUdp( udpPort ); + + sendGameMessage( udpSock, 0x1337, 0x07734, data0, sizeof( data0 ) ); + + waitResult = WaitForSingleObject( event0, 2000 ); + todo_wine ok( waitResult == WAIT_OBJECT_0, "message wait returned %lu\n", waitResult ); + + fromId = 0xdeadbeef; + toId = 0xdeadbeef; + memset( msgData, 0xcc, sizeof( msgData ) ); + msgDataSize = sizeof( msgData ); + hr = IDirectPlayX_Receive( dp, &fromId, &toId, 0, msgData, &msgDataSize ); + todo_wine ok( hr == DP_OK, "got hr %#lx.\n", hr ); + todo_wine ok( fromId == 0x1337, "got source id %#lx.\n", fromId ); + todo_wine ok( toId == 0x07734, "got destination id %#lx.\n", toId ); + todo_wine ok( !memcmp( msgData, data0, sizeof( data0 ) ), "message data didn't match.\n" ); + todo_wine ok( msgDataSize == sizeof( data0 ), "got message size %lu.\n", msgDataSize ); + + msgDataSize = sizeof( msgData ); + hr = IDirectPlayX_Receive( dp, &fromId, &toId, 0, msgData, &msgDataSize ); + ok( hr == DPERR_NOMESSAGES, "got hr %#lx.\n", hr ); + + closesocket( udpSock ); closesocket( recvSock ); closesocket( sendSock );