Ismael Barros : dplayx: Tests for checking remote data replication.
Alexandre Julliard
julliard at winehq.org
Wed Aug 20 08:14:03 CDT 2008
Module: wine
Branch: master
Commit: 063c1e6c9797b312f83a2ba9c7501635dbb9022c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=063c1e6c9797b312f83a2ba9c7501635dbb9022c
Author: Ismael Barros <razielmine at gmail.com>
Date: Tue Aug 5 03:56:32 2008 +0200
dplayx: Tests for checking remote data replication.
---
dlls/dplayx/tests/dplayx.c | 228 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 228 insertions(+), 0 deletions(-)
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c
index 93e93e4..4fdc494 100644
--- a/dlls/dplayx/tests/dplayx.c
+++ b/dlls/dplayx/tests/dplayx.c
@@ -5988,6 +5988,232 @@ static void test_GetMessageQueue(void)
}
+/* Remote data replication */
+
+static void test_remote_data_replication(void)
+{
+
+ LPDIRECTPLAY4 pDP[2];
+ DPSESSIONDESC2 dpsd;
+ DPID dpid[2], idFrom, idTo;
+ CallbackData callbackData;
+ HRESULT hr;
+ UINT i, j;
+ DWORD dwFlags, dwDataSize = 1024;
+ DWORD dwCount;
+
+ LPDPMSG_SETPLAYERORGROUPDATA lpData = HeapAlloc( GetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ dwDataSize );
+
+ LPCSTR lpDataLocal[] = { "local_0", "local_1" };
+ LPCSTR lpDataRemote[] = { "remote_0", "remote_1" };
+ LPCSTR lpDataFake = "ugly_fake_data";
+ LPSTR lpDataGet = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 32 );
+ DWORD dwDataSizeLocal = strlen(lpDataLocal[0])+1,
+ dwDataSizeRemote = strlen(lpDataRemote[0])+1,
+ dwDataSizeFake = strlen(lpDataFake)+1,
+ dwDataSizeGet;
+
+
+ for (i=0; i<2; i++)
+ {
+ CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_ALL,
+ &IID_IDirectPlay4A, (LPVOID*) &pDP[i] );
+ init_TCPIP_provider( pDP[i], "127.0.0.1", 0 );
+ }
+ ZeroMemory( &dpsd, sizeof(DPSESSIONDESC2) );
+ dpsd.dwSize = sizeof(DPSESSIONDESC2);
+ dpsd.guidApplication = appGuid;
+
+ /* Host */
+ hr = IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
+ todo_wine checkHR( DP_OK, hr );
+
+ if ( hr == DPERR_UNINITIALIZED )
+ {
+ skip( "dplay not implemented enough for this test yet\n" );
+ return;
+ }
+
+ hr = IDirectPlayX_CreatePlayer( pDP[0], &dpid[0],
+ NULL, NULL, NULL, 0, 0 );
+ checkHR( DP_OK, hr );
+
+ /* Peer */
+ hr = IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
+ (LPVOID) pDP[1], 0 );
+ checkHR( DP_OK, hr );
+
+ hr = IDirectPlayX_CreatePlayer( pDP[1], &dpid[1],
+ NULL, NULL, NULL, 0, 0 );
+ checkHR( DP_OK, hr );
+
+ /* Check players */
+ for (i=0; i<2; i++)
+ {
+ /* Local (0,0) (1,1) */
+ IDirectPlayX_GetPlayerFlags( pDP[i], dpid[i], &dwFlags );
+ checkFlags( DPPLAYER_LOCAL, dwFlags, FLAGS_DPPLAYER );
+ /* Remote (0,1) (1,0) */
+ IDirectPlayX_GetPlayerFlags( pDP[i], dpid[!i], &dwFlags );
+ checkFlags( 0, dwFlags, FLAGS_DPPLAYER );
+ }
+
+ /* Set data for a local player */
+ for (i=0; i<2; i++)
+ {
+ hr = IDirectPlayX_SetPlayerData( pDP[i], dpid[i],
+ (LPVOID) lpDataLocal[i],
+ dwDataSizeLocal,
+ DPSET_LOCAL );
+ checkHR( DP_OK, hr );
+ hr = IDirectPlayX_SetPlayerData( pDP[i], dpid[i],
+ (LPVOID) lpDataRemote[i],
+ dwDataSizeRemote,
+ DPSET_REMOTE );
+ checkHR( DP_OK, hr );
+ }
+
+ /* Retrieve data locally (0->0, 1->1) */
+ for (i=0; i<2; i++)
+ {
+ dwDataSizeGet = dwDataSizeFake;
+ strcpy( lpDataGet, lpDataFake );
+ hr = IDirectPlayX_GetPlayerData( pDP[i], dpid[i],
+ lpDataGet, &dwDataSizeGet,
+ DPGET_LOCAL );
+ checkHR( DP_OK, hr );
+ check( dwDataSizeLocal, dwDataSizeGet );
+ checkStr( lpDataLocal[i], lpDataGet );
+
+ dwDataSizeGet = dwDataSizeFake;
+ strcpy( lpDataGet, lpDataFake );
+ hr = IDirectPlayX_GetPlayerData( pDP[i], dpid[i],
+ lpDataGet, &dwDataSizeGet,
+ DPGET_REMOTE );
+ checkHR( DP_OK, hr );
+ check( dwDataSizeRemote, dwDataSizeGet );
+ checkStr( lpDataRemote[i], lpDataGet );
+ }
+
+
+ /* Set data for a remote player */
+ /* This should fail with DPERR_ACCESSDENIED,
+ but for some reason it doesn't */
+ for (i=0; i<2; i++)
+ {
+ IDirectPlayX_SetPlayerData( pDP[i], dpid[!i],
+ (LPVOID) lpDataLocal[!i],
+ dwDataSizeLocal,
+ DPSET_LOCAL );
+ checkHR( DP_OK, hr );
+ IDirectPlayX_SetPlayerData( pDP[i], dpid[!i],
+ (LPVOID) lpDataRemote[!i],
+ dwDataSizeRemote,
+ DPSET_REMOTE );
+ checkHR( DP_OK, hr );
+ }
+
+ /* Retrieve crossed data (0->1, 1->0) */
+ for (i=0; i<2; i++)
+ {
+ dwDataSizeGet = dwDataSizeFake;
+ strcpy( lpDataGet, lpDataFake );
+ hr = IDirectPlayX_GetPlayerData( pDP[i], dpid[!i],
+ lpDataGet, &dwDataSizeGet,
+ DPGET_LOCAL );
+ checkHR( DP_OK, hr );
+ check( dwDataSizeLocal, dwDataSizeGet );
+ checkStr( lpDataLocal[!i], lpDataGet );
+
+ dwDataSizeGet = dwDataSizeFake;
+ strcpy( lpDataGet, lpDataFake );
+ hr = IDirectPlayX_GetPlayerData( pDP[i], dpid[!i],
+ lpDataGet, &dwDataSizeGet,
+ DPGET_REMOTE );
+ checkHR( DP_OK, hr );
+ check( dwDataSizeRemote, dwDataSizeGet );
+ checkStr( lpDataRemote[!i], lpDataGet );
+ }
+
+
+ /* Purge "new player" messages from queue */
+ hr = IDirectPlayX_Receive( pDP[0], &idFrom, &idTo, 0,
+ (LPVOID) lpData, &dwDataSize );
+ checkHR( DP_OK, hr );
+ checkConv( DPSYS_CREATEPLAYERORGROUP, lpData->dwType, dpMsgType2str );
+
+ /* Check number of messages in queue */
+ for (i=0; i<2; i++)
+ {
+ IDirectPlayX_GetMessageCount( pDP[i], dpid[i], &dwCount );
+ check( 2, dwCount );
+ IDirectPlayX_GetMessageCount( pDP[i], dpid[!i], &dwCount );
+ check( 0, dwCount );
+ }
+
+ /* Checking system messages */
+ for (i=0; i<2; i++)
+ {
+ for (j=0; j<2; j++)
+ {
+ hr = IDirectPlayX_Receive( pDP[i], &idFrom, &idTo, 0,
+ (LPVOID) lpData, &dwDataSize );
+ checkHR( DP_OK, hr );
+ check( 29, dwDataSize );
+ check( DPID_SYSMSG, idFrom );
+ check( dpid[i], idTo );
+ checkConv( DPSYS_SETPLAYERORGROUPDATA, lpData->dwType,
+ dpMsgType2str );
+ check( DPPLAYERTYPE_PLAYER, lpData->dwPlayerType );
+ check( dpid[j], lpData->dpId );
+ checkStr( lpDataRemote[j], (LPSTR) lpData->lpData );
+ check( dwDataSizeRemote, lpData->dwDataSize );
+ dwDataSize = 1024;
+ }
+ hr = IDirectPlayX_Receive( pDP[i], &idFrom, &idTo, 0,
+ lpData, &dwDataSize );
+ checkHR( DPERR_NOMESSAGES, hr );
+ }
+
+
+ /* Changing remote data */
+ hr = IDirectPlayX_SetPlayerData( pDP[0], dpid[0],
+ (LPVOID) lpDataRemote[0], dwDataSizeRemote,
+ DPSET_REMOTE );
+ checkHR( DP_OK, hr );
+
+ /* Checking system messages (j=0) */
+ for (i=0; i<2; i++)
+ {
+ hr = IDirectPlayX_Receive( pDP[i], &idFrom, &idTo, 0,
+ lpData, &dwDataSize );
+ checkHR( DP_OK, hr );
+ check( 29, dwDataSize );
+ check( DPID_SYSMSG, idFrom );
+ check( dpid[i], idTo );
+ checkConv( DPSYS_SETPLAYERORGROUPDATA, lpData->dwType, dpMsgType2str );
+ check( DPPLAYERTYPE_PLAYER, lpData->dwPlayerType );
+ check( dpid[0], lpData->dpId );
+ checkStr( lpDataRemote[0], (LPSTR) lpData->lpData );
+ check( dwDataSizeRemote, lpData->dwDataSize );
+ dwDataSize = 1024;
+ }
+
+ /* Queue is empty */
+ check_messages( pDP[0], dpid, 2, &callbackData );
+ checkStr( "", callbackData.szTrace1 );
+ check_messages( pDP[1], dpid, 2, &callbackData );
+ checkStr( "", callbackData.szTrace1 );
+
+
+ HeapFree( GetProcessHeap(), 0, lpData );
+ IDirectPlayX_Release( pDP[0] );
+ IDirectPlayX_Release( pDP[1] );
+
+}
+
START_TEST(dplayx)
{
@@ -6025,5 +6251,7 @@ START_TEST(dplayx)
test_GetMessageCount();
test_GetMessageQueue();
+ test_remote_data_replication();
+
CoUninitialize();
}
More information about the wine-cvs
mailing list