mirror of
https://github.com/solemnwarning/directplay-lite
synced 2024-12-30 16:45:37 +01:00
Simple SendTo tests
This commit is contained in:
parent
25341f2488
commit
e8fdf2ecb1
@ -7,7 +7,7 @@
|
|||||||
#include "../src/DirectPlay8Address.hpp"
|
#include "../src/DirectPlay8Address.hpp"
|
||||||
#include "../src/DirectPlay8Peer.hpp"
|
#include "../src/DirectPlay8Peer.hpp"
|
||||||
|
|
||||||
// #define INSTANTIATE_FROM_COM
|
#define INSTANTIATE_FROM_COM
|
||||||
|
|
||||||
#define PORT 42895
|
#define PORT 42895
|
||||||
|
|
||||||
@ -1592,3 +1592,457 @@ TEST(DirectPlay8Peer, ConnectAsyncFail)
|
|||||||
|
|
||||||
EXPECT_EQ(p1_seq, 1);
|
EXPECT_EQ(p1_seq, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(DirectPlay8Peer, SendToPeerToHost)
|
||||||
|
{
|
||||||
|
std::atomic<bool> testing(false);
|
||||||
|
|
||||||
|
std::atomic<int> host_seq(0), p1_seq(0);
|
||||||
|
DPNID host_player_id = -1, p1_player_id = -1;
|
||||||
|
|
||||||
|
SessionHost host(APP_GUID_1, L"Session 1", PORT,
|
||||||
|
[&testing, &host_seq, &host_player_id, &p1_player_id]
|
||||||
|
(DWORD dwMessageType, PVOID pMessage)
|
||||||
|
{
|
||||||
|
if(dwMessageType == DPN_MSGID_CREATE_PLAYER)
|
||||||
|
{
|
||||||
|
DPNMSG_CREATE_PLAYER *cp = (DPNMSG_CREATE_PLAYER*)(pMessage);
|
||||||
|
|
||||||
|
if(host_player_id == -1)
|
||||||
|
{
|
||||||
|
host_player_id = cp->dpnidPlayer;
|
||||||
|
cp->pvPlayerContext = (void*)(0x0001);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
cp->pvPlayerContext = (void*)(0x0002);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!testing)
|
||||||
|
{
|
||||||
|
return DPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int seq = ++host_seq;
|
||||||
|
|
||||||
|
switch(seq)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
EXPECT_EQ(dwMessageType, DPN_MSGID_RECEIVE);
|
||||||
|
|
||||||
|
if(dwMessageType == DPN_MSGID_RECEIVE)
|
||||||
|
{
|
||||||
|
DPNMSG_RECEIVE *r = (DPNMSG_RECEIVE*)(pMessage);
|
||||||
|
|
||||||
|
EXPECT_EQ(r->dwSize, sizeof(*r));
|
||||||
|
EXPECT_EQ(r->dpnidSender, p1_player_id);
|
||||||
|
EXPECT_EQ(r->pvPlayerContext, (void*)(0x0002));
|
||||||
|
EXPECT_EQ(r->dwReceiveFlags, 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(
|
||||||
|
std::string((const char*)(r->pReceiveData), r->dwReceiveDataSize),
|
||||||
|
std::string("Hello, world"));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
ADD_FAILURE() << "Unexpected message of type " << dwMessageType <<", sequence " << seq;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DPN_OK;
|
||||||
|
});
|
||||||
|
|
||||||
|
DPNHANDLE send_handle;
|
||||||
|
|
||||||
|
std::function<HRESULT(DWORD,PVOID)> p1_cb =
|
||||||
|
[&testing, &p1_seq, &p1_player_id, &send_handle]
|
||||||
|
(DWORD dwMessageType, PVOID pMessage)
|
||||||
|
{
|
||||||
|
if(dwMessageType == DPN_MSGID_CONNECT_COMPLETE)
|
||||||
|
{
|
||||||
|
DPNMSG_CONNECT_COMPLETE *cc = (DPNMSG_CONNECT_COMPLETE*)(pMessage);
|
||||||
|
p1_player_id = cc->dpnidLocal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!testing)
|
||||||
|
{
|
||||||
|
return DPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int seq = ++p1_seq;
|
||||||
|
|
||||||
|
switch(seq)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
EXPECT_EQ(dwMessageType, DPN_MSGID_SEND_COMPLETE);
|
||||||
|
|
||||||
|
if(dwMessageType == DPN_MSGID_SEND_COMPLETE)
|
||||||
|
{
|
||||||
|
DPNMSG_SEND_COMPLETE *sc = (DPNMSG_SEND_COMPLETE*)(pMessage);
|
||||||
|
|
||||||
|
EXPECT_EQ(sc->dwSize, sizeof(*sc));
|
||||||
|
EXPECT_EQ(sc->hAsyncOp, send_handle);
|
||||||
|
EXPECT_EQ(sc->pvUserContext, (void*)(0xABCD));
|
||||||
|
EXPECT_EQ(sc->hResultCode, DPN_OK);
|
||||||
|
EXPECT_EQ(sc->dwSendCompleteFlags, 0);
|
||||||
|
EXPECT_EQ(sc->pBuffers, (DPN_BUFFER_DESC*)(NULL));
|
||||||
|
EXPECT_EQ(sc->dwNumBuffers, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
ADD_FAILURE() << "Unexpected message of type " << dwMessageType <<", sequence " << seq;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DPN_OK;
|
||||||
|
};
|
||||||
|
|
||||||
|
IDP8PeerInstance p1;
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->Initialize(&p1_cb, &callback_shim, 0), S_OK);
|
||||||
|
|
||||||
|
DPN_APPLICATION_DESC connect_to_app;
|
||||||
|
memset(&connect_to_app, 0, sizeof(connect_to_app));
|
||||||
|
|
||||||
|
connect_to_app.dwSize = sizeof(connect_to_app);
|
||||||
|
connect_to_app.guidApplication = APP_GUID_1;
|
||||||
|
|
||||||
|
IDP8AddressInstance connect_to_addr(L"127.0.0.1", PORT);
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->Connect(
|
||||||
|
&connect_to_app, /* pdnAppDesc */
|
||||||
|
connect_to_addr, /* pHostAddr */
|
||||||
|
NULL, /* pDeviceInfo */
|
||||||
|
NULL, /* pdnSecurity */
|
||||||
|
NULL, /* pdnCredentials */
|
||||||
|
NULL, /* pvUserConnectData */
|
||||||
|
0, /* dwUserConnectDataSize */
|
||||||
|
NULL, /* pvPlayerContext */
|
||||||
|
NULL, /* pvAsyncContext */
|
||||||
|
NULL, /* phAsyncHandle */
|
||||||
|
DPNCONNECT_SYNC /* dwFlags */
|
||||||
|
), S_OK);
|
||||||
|
|
||||||
|
/* Give everything a moment to settle. */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
testing = true;
|
||||||
|
|
||||||
|
DPN_BUFFER_DESC bd[] = {
|
||||||
|
{ 12, (BYTE*)("Hello, world") },
|
||||||
|
};
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->SendTo(
|
||||||
|
host_player_id,
|
||||||
|
bd,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
(void*)(0xABCD),
|
||||||
|
&send_handle,
|
||||||
|
0
|
||||||
|
), DPNSUCCESS_PENDING);
|
||||||
|
|
||||||
|
/* Let the message get through any any resultant messages happen. */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
EXPECT_EQ(host_seq, 1);
|
||||||
|
EXPECT_EQ(p1_seq, 1);
|
||||||
|
|
||||||
|
testing = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(DirectPlay8Peer, SendToHostToPeer)
|
||||||
|
{
|
||||||
|
std::atomic<bool> testing(false);
|
||||||
|
|
||||||
|
std::atomic<int> host_seq(0), p1_seq(0);
|
||||||
|
DPNID host_player_id = -1, p1_player_id = -1;
|
||||||
|
DPNHANDLE send_handle;
|
||||||
|
|
||||||
|
SessionHost host(APP_GUID_1, L"Session 1", PORT,
|
||||||
|
[&testing, &host_seq, &host_player_id, &send_handle]
|
||||||
|
(DWORD dwMessageType, PVOID pMessage)
|
||||||
|
{
|
||||||
|
if(dwMessageType == DPN_MSGID_CREATE_PLAYER && host_player_id == -1)
|
||||||
|
{
|
||||||
|
DPNMSG_CREATE_PLAYER *cp = (DPNMSG_CREATE_PLAYER*)(pMessage);
|
||||||
|
host_player_id = cp->dpnidPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!testing)
|
||||||
|
{
|
||||||
|
return DPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int seq = ++host_seq;
|
||||||
|
|
||||||
|
switch(seq)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
EXPECT_EQ(dwMessageType, DPN_MSGID_SEND_COMPLETE);
|
||||||
|
|
||||||
|
if(dwMessageType == DPN_MSGID_SEND_COMPLETE)
|
||||||
|
{
|
||||||
|
DPNMSG_SEND_COMPLETE *sc = (DPNMSG_SEND_COMPLETE*)(pMessage);
|
||||||
|
|
||||||
|
EXPECT_EQ(sc->dwSize, sizeof(*sc));
|
||||||
|
EXPECT_EQ(sc->hAsyncOp, send_handle);
|
||||||
|
EXPECT_EQ(sc->pvUserContext, (void*)(0xABCD));
|
||||||
|
EXPECT_EQ(sc->hResultCode, DPN_OK);
|
||||||
|
EXPECT_EQ(sc->dwSendCompleteFlags, 0);
|
||||||
|
EXPECT_EQ(sc->pBuffers, (DPN_BUFFER_DESC*)(NULL));
|
||||||
|
EXPECT_EQ(sc->dwNumBuffers, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
ADD_FAILURE() << "Unexpected message of type " << dwMessageType <<", sequence " << seq;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DPN_OK;
|
||||||
|
});
|
||||||
|
|
||||||
|
std::function<HRESULT(DWORD,PVOID)> p1_cb =
|
||||||
|
[&testing, &p1_seq, &p1_player_id, &host_player_id]
|
||||||
|
(DWORD dwMessageType, PVOID pMessage)
|
||||||
|
{
|
||||||
|
if(dwMessageType == DPN_MSGID_CONNECT_COMPLETE)
|
||||||
|
{
|
||||||
|
DPNMSG_CONNECT_COMPLETE *cc = (DPNMSG_CONNECT_COMPLETE*)(pMessage);
|
||||||
|
p1_player_id = cc->dpnidLocal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!testing)
|
||||||
|
{
|
||||||
|
return DPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int seq = ++p1_seq;
|
||||||
|
|
||||||
|
switch(seq)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
EXPECT_EQ(dwMessageType, DPN_MSGID_RECEIVE);
|
||||||
|
|
||||||
|
if(dwMessageType == DPN_MSGID_RECEIVE)
|
||||||
|
{
|
||||||
|
DPNMSG_RECEIVE *r = (DPNMSG_RECEIVE*)(pMessage);
|
||||||
|
|
||||||
|
EXPECT_EQ(r->dwSize, sizeof(*r));
|
||||||
|
EXPECT_EQ(r->dpnidSender, host_player_id);
|
||||||
|
EXPECT_EQ(r->pvPlayerContext, (void*)(NULL));
|
||||||
|
EXPECT_EQ(r->dwReceiveFlags, 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(
|
||||||
|
std::string((const char*)(r->pReceiveData), r->dwReceiveDataSize),
|
||||||
|
std::string("Hello, world"));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
ADD_FAILURE() << "Unexpected message of type " << dwMessageType <<", sequence " << seq;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DPN_OK;
|
||||||
|
};
|
||||||
|
|
||||||
|
IDP8PeerInstance p1;
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->Initialize(&p1_cb, &callback_shim, 0), S_OK);
|
||||||
|
|
||||||
|
DPN_APPLICATION_DESC connect_to_app;
|
||||||
|
memset(&connect_to_app, 0, sizeof(connect_to_app));
|
||||||
|
|
||||||
|
connect_to_app.dwSize = sizeof(connect_to_app);
|
||||||
|
connect_to_app.guidApplication = APP_GUID_1;
|
||||||
|
|
||||||
|
IDP8AddressInstance connect_to_addr(L"127.0.0.1", PORT);
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->Connect(
|
||||||
|
&connect_to_app, /* pdnAppDesc */
|
||||||
|
connect_to_addr, /* pHostAddr */
|
||||||
|
NULL, /* pDeviceInfo */
|
||||||
|
NULL, /* pdnSecurity */
|
||||||
|
NULL, /* pdnCredentials */
|
||||||
|
NULL, /* pvUserConnectData */
|
||||||
|
0, /* dwUserConnectDataSize */
|
||||||
|
NULL, /* pvPlayerContext */
|
||||||
|
NULL, /* pvAsyncContext */
|
||||||
|
NULL, /* phAsyncHandle */
|
||||||
|
DPNCONNECT_SYNC /* dwFlags */
|
||||||
|
), S_OK);
|
||||||
|
|
||||||
|
/* Give everything a moment to settle. */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
testing = true;
|
||||||
|
|
||||||
|
DPN_BUFFER_DESC bd[] = {
|
||||||
|
{ 12, (BYTE*)("Hello, world") },
|
||||||
|
};
|
||||||
|
|
||||||
|
ASSERT_EQ(host->SendTo(
|
||||||
|
p1_player_id,
|
||||||
|
bd,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
(void*)(0xABCD),
|
||||||
|
&send_handle,
|
||||||
|
0
|
||||||
|
), DPNSUCCESS_PENDING);
|
||||||
|
|
||||||
|
/* Let the message get through any any resultant messages happen. */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
EXPECT_EQ(host_seq, 1);
|
||||||
|
EXPECT_EQ(p1_seq, 1);
|
||||||
|
|
||||||
|
testing = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(DirectPlay8Peer, SendToSync)
|
||||||
|
{
|
||||||
|
std::atomic<bool> testing(false);
|
||||||
|
|
||||||
|
std::atomic<int> host_seq(0), p1_seq(0);
|
||||||
|
DPNID host_player_id = -1, p1_player_id = -1;
|
||||||
|
|
||||||
|
SessionHost host(APP_GUID_1, L"Session 1", PORT,
|
||||||
|
[&testing, &host_seq, &host_player_id, &p1_player_id]
|
||||||
|
(DWORD dwMessageType, PVOID pMessage)
|
||||||
|
{
|
||||||
|
if(dwMessageType == DPN_MSGID_CREATE_PLAYER && host_player_id == -1)
|
||||||
|
{
|
||||||
|
DPNMSG_CREATE_PLAYER *cp = (DPNMSG_CREATE_PLAYER*)(pMessage);
|
||||||
|
host_player_id = cp->dpnidPlayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!testing)
|
||||||
|
{
|
||||||
|
return DPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int seq = ++host_seq;
|
||||||
|
|
||||||
|
switch(seq)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
EXPECT_EQ(dwMessageType, DPN_MSGID_RECEIVE);
|
||||||
|
|
||||||
|
if(dwMessageType == DPN_MSGID_RECEIVE)
|
||||||
|
{
|
||||||
|
DPNMSG_RECEIVE *r = (DPNMSG_RECEIVE*)(pMessage);
|
||||||
|
|
||||||
|
EXPECT_EQ(r->dwSize, sizeof(*r));
|
||||||
|
EXPECT_EQ(r->dpnidSender, p1_player_id);
|
||||||
|
EXPECT_EQ(r->pvPlayerContext, (void*)(NULL));
|
||||||
|
EXPECT_EQ(r->dwReceiveFlags, 0);
|
||||||
|
|
||||||
|
EXPECT_EQ(
|
||||||
|
std::string((const char*)(r->pReceiveData), r->dwReceiveDataSize),
|
||||||
|
std::string("Hello, world"));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
ADD_FAILURE() << "Unexpected message of type " << dwMessageType <<", sequence " << seq;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DPN_OK;
|
||||||
|
});
|
||||||
|
|
||||||
|
std::function<HRESULT(DWORD,PVOID)> p1_cb =
|
||||||
|
[&testing, &p1_seq, &p1_player_id]
|
||||||
|
(DWORD dwMessageType, PVOID pMessage)
|
||||||
|
{
|
||||||
|
if(dwMessageType == DPN_MSGID_CONNECT_COMPLETE)
|
||||||
|
{
|
||||||
|
DPNMSG_CONNECT_COMPLETE *cc = (DPNMSG_CONNECT_COMPLETE*)(pMessage);
|
||||||
|
p1_player_id = cc->dpnidLocal;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!testing)
|
||||||
|
{
|
||||||
|
return DPN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int seq = ++p1_seq;
|
||||||
|
|
||||||
|
ADD_FAILURE() << "Unexpected message of type " << dwMessageType <<", sequence " << seq;
|
||||||
|
|
||||||
|
return DPN_OK;
|
||||||
|
};
|
||||||
|
|
||||||
|
IDP8PeerInstance p1;
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->Initialize(&p1_cb, &callback_shim, 0), S_OK);
|
||||||
|
|
||||||
|
DPN_APPLICATION_DESC connect_to_app;
|
||||||
|
memset(&connect_to_app, 0, sizeof(connect_to_app));
|
||||||
|
|
||||||
|
connect_to_app.dwSize = sizeof(connect_to_app);
|
||||||
|
connect_to_app.guidApplication = APP_GUID_1;
|
||||||
|
|
||||||
|
IDP8AddressInstance connect_to_addr(L"127.0.0.1", PORT);
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->Connect(
|
||||||
|
&connect_to_app, /* pdnAppDesc */
|
||||||
|
connect_to_addr, /* pHostAddr */
|
||||||
|
NULL, /* pDeviceInfo */
|
||||||
|
NULL, /* pdnSecurity */
|
||||||
|
NULL, /* pdnCredentials */
|
||||||
|
NULL, /* pvUserConnectData */
|
||||||
|
0, /* dwUserConnectDataSize */
|
||||||
|
NULL, /* pvPlayerContext */
|
||||||
|
NULL, /* pvAsyncContext */
|
||||||
|
NULL, /* phAsyncHandle */
|
||||||
|
DPNCONNECT_SYNC /* dwFlags */
|
||||||
|
), S_OK);
|
||||||
|
|
||||||
|
/* Give everything a moment to settle. */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
testing = true;
|
||||||
|
|
||||||
|
DPN_BUFFER_DESC bd[] = {
|
||||||
|
{ 12, (BYTE*)("Hello, world") },
|
||||||
|
};
|
||||||
|
|
||||||
|
ASSERT_EQ(p1->SendTo(
|
||||||
|
host_player_id,
|
||||||
|
bd,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
DPNSEND_SYNC
|
||||||
|
), DPN_OK);
|
||||||
|
|
||||||
|
/* Let the message get through any any resultant messages happen. */
|
||||||
|
Sleep(250);
|
||||||
|
|
||||||
|
EXPECT_EQ(host_seq, 1);
|
||||||
|
EXPECT_EQ(p1_seq, 0);
|
||||||
|
|
||||||
|
testing = false;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user