343 lines
9.5 KiB
C++
343 lines
9.5 KiB
C++
/*
|
|
* Copyright (c) 2014, Oculus VR, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* RakNet License.txt file in the licenses directory of this source tree. An additional grant
|
|
* of patent rights can be found in the RakNet Patents.txt file in the same directory.
|
|
*
|
|
*/
|
|
|
|
#include "PacketAndLowLevelTestsTest.h"
|
|
|
|
|
|
/*
|
|
Description:
|
|
Tests out the sunctions:
|
|
virtual int RakPeerInterface::GetSplitMessageProgressInterval ( void ) const "
|
|
virtual void RakPeerInterface::PushBackPacket ( Packet * packet, bool pushAtHead ) "
|
|
virtual bool RakPeerInterface::SendList ( char ** data, const int * lengths, const int numParameters, PacketPriority priority, PacketReliability reliability, char orderingChannel, SystemAddress systemAddress, bool broadcast ) "
|
|
virtual void RakPeerInterface::SetSplitMessageProgressInterval ( int interval )
|
|
virtual void RakPeerInterface::SetUnreliableTimeout ( TimeMS timeoutMS )
|
|
virtual Packet* RakPeerInterface::AllocatePacket ( unsigned dataSize )
|
|
AttachPlugin (PluginInterface2 *plugin)=0
|
|
DetachPlugin (PluginInterface2 *plugin)=0
|
|
|
|
Success conditions:
|
|
|
|
Failure conditions:
|
|
|
|
RakPeerInterface Functions used, tested indirectly by its use,list may not be complete:
|
|
Startup
|
|
SetMaximumIncomingConnections
|
|
Receive
|
|
DeallocatePacket
|
|
Send
|
|
IsConnected
|
|
RakPeerInterface Functions Explicitly Tested:
|
|
GetSplitMessageProgressInterval
|
|
PushBackPacket
|
|
SendList
|
|
SetSplitMessageProgressInterval
|
|
AllocatePacket
|
|
GetMTUSize
|
|
AttachPlugin
|
|
DetachPlugin
|
|
|
|
*/
|
|
int PacketAndLowLevelTestsTest::RunTest(DataStructures::List<RakString> params,bool isVerbose,bool noPauses)
|
|
{
|
|
RakPeerInterface *server,*client;
|
|
destroyList.Clear(false,_FILE_AND_LINE_);
|
|
|
|
TestHelpers::StandardClientPrep(client,destroyList);
|
|
TestHelpers::StandardServerPrep(server,destroyList);
|
|
printf("Connecting to server\n");
|
|
if (!TestHelpers::WaitAndConnectTwoPeersLocally(client,server,5000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[1-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 1;
|
|
}
|
|
|
|
printf("Testing SendList\n");
|
|
|
|
char* dataList2[5];
|
|
char **dataList=(char **)dataList2;
|
|
int lengths[5];
|
|
char curString1[]="AAAA";
|
|
char curString2[]="ABBB";
|
|
char curString3[]="ACCC";
|
|
char curString4[]="ADDD";
|
|
char curString5[]="AEEE";
|
|
|
|
dataList[0]=curString1;
|
|
dataList[1]=curString2;
|
|
dataList[2]=curString3;
|
|
dataList[3]=curString4;
|
|
dataList[4]=curString5;
|
|
|
|
for (int i=0;i<5;i++)
|
|
{
|
|
dataList[i][0]=ID_USER_PACKET_ENUM+1+i;
|
|
lengths[i]=5;
|
|
}
|
|
|
|
client->SendList((const char**)dataList,lengths,5,HIGH_PRIORITY,RELIABLE_ORDERED,0, UNASSIGNED_SYSTEM_ADDRESS, true);
|
|
|
|
Packet* packet;
|
|
if (!(packet=CommonFunctions::WaitAndReturnMessageWithID(server,ID_USER_PACKET_ENUM+1,1000)))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[9-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 9;
|
|
}
|
|
|
|
if (packet->length!=25)
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[13],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 14;
|
|
|
|
}
|
|
|
|
server->DeallocatePacket(packet);
|
|
|
|
PluginInterface2* myPlug=new PacketChangerPlugin();
|
|
|
|
printf("Test attach detach of plugins\n");
|
|
client->AttachPlugin(myPlug);
|
|
TestHelpers::BroadCastTestPacket(client);
|
|
if (TestHelpers::WaitForTestPacket(server,2000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[2-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 2;
|
|
}
|
|
|
|
client->DetachPlugin(myPlug);
|
|
TestHelpers::BroadCastTestPacket(client);
|
|
if (!TestHelpers::WaitForTestPacket(server,2000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[3-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 3;
|
|
}
|
|
|
|
printf("Test AllocatePacket\n");
|
|
Packet * hugePacket,*hugePacket2;
|
|
const int dataSize=3000000;//around 30 meg didn't want to calculate the exact
|
|
hugePacket=client->AllocatePacket(dataSize);
|
|
hugePacket2=client->AllocatePacket(dataSize);
|
|
|
|
/*//Couldn't find a good cross platform way for allocated memory so skipped this check
|
|
if (somemalloccheck<3000000)
|
|
{}
|
|
*/
|
|
|
|
printf("Assuming 3000000 allocation for splitpacket, testing setsplitpacket\n");
|
|
|
|
hugePacket->data[0]=ID_USER_PACKET_ENUM+1;
|
|
hugePacket2->data[0]=ID_USER_PACKET_ENUM+1;
|
|
|
|
server->SetSplitMessageProgressInterval(1);
|
|
|
|
if (server->GetSplitMessageProgressInterval()!=1)
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[4-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 4;
|
|
|
|
}
|
|
|
|
if (!client->Send((const char *)hugePacket->data,dataSize,HIGH_PRIORITY,RELIABLE_ORDERED,0, UNASSIGNED_SYSTEM_ADDRESS, true))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[5-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 5;
|
|
}
|
|
|
|
if (!CommonFunctions::WaitForMessageWithID(server,ID_DOWNLOAD_PROGRESS,2000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[6-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 6;
|
|
}
|
|
|
|
while(CommonFunctions::WaitForMessageWithID(server,ID_DOWNLOAD_PROGRESS,500))//Clear out the rest before next test
|
|
{
|
|
}
|
|
|
|
printf("Making sure still connected, if not connect\n");
|
|
if (!TestHelpers::WaitAndConnectTwoPeersLocally(client,server,5000))//Make sure connected before test
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[11-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 11;
|
|
}
|
|
|
|
printf("Making sure standard send/recieve still functioning\n");
|
|
TestHelpers::BroadCastTestPacket(client);
|
|
if (!TestHelpers::WaitForTestPacket(server,5000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[12],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 13;
|
|
}
|
|
|
|
printf("Testing PushBackPacket\n");
|
|
|
|
server->PushBackPacket(hugePacket,false);
|
|
|
|
if (!TestHelpers::WaitForTestPacket(server,2000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[7-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 7;
|
|
}
|
|
|
|
printf("Making sure still connected, if not connect\n");
|
|
if (!TestHelpers::WaitAndConnectTwoPeersLocally(client,server,5000))//Make sure connected before test
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[11-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 11;
|
|
}
|
|
|
|
printf("Making sure standard send/recieve still functioning\n");
|
|
TestHelpers::BroadCastTestPacket(client);
|
|
if (!TestHelpers::WaitForTestPacket(server,2000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[12-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 12;
|
|
}
|
|
|
|
printf("PushBackPacket head true test\n");
|
|
server->PushBackPacket(hugePacket2,true);
|
|
|
|
if (!TestHelpers::WaitForTestPacket(server,2000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[10-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 10;
|
|
}
|
|
|
|
printf("Making sure still connected, if not connect\n");
|
|
if (!TestHelpers::WaitAndConnectTwoPeersLocally(client,server,5000))//Make sure connected before test
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[11-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 11;
|
|
}
|
|
|
|
printf("Run recieve test\n");
|
|
TestHelpers::BroadCastTestPacket(client);
|
|
if (!TestHelpers::WaitForTestPacket(server,2000))
|
|
{
|
|
|
|
if (isVerbose)
|
|
DebugTools::ShowError(errorList[12-1],!noPauses && isVerbose,__LINE__,__FILE__);
|
|
|
|
return 12;
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
void PacketAndLowLevelTestsTest::FloodWithHighPriority(RakPeerInterface* client)
|
|
{
|
|
|
|
for (int i=0;i<60000;i++)
|
|
{
|
|
TestHelpers::BroadCastTestPacket(client,UNRELIABLE,HIGH_PRIORITY,ID_USER_PACKET_ENUM+2);
|
|
}
|
|
|
|
}
|
|
|
|
RakString PacketAndLowLevelTestsTest::GetTestName()
|
|
{
|
|
|
|
return "PacketAndLowLevelTestsTest";
|
|
|
|
}
|
|
|
|
RakString PacketAndLowLevelTestsTest::ErrorCodeToString(int errorCode)
|
|
{
|
|
|
|
if (errorCode>0&&(unsigned int)errorCode<=errorList.Size())
|
|
{
|
|
return errorList[errorCode-1];
|
|
}
|
|
else
|
|
{
|
|
return "Undefined Error";
|
|
}
|
|
|
|
}
|
|
|
|
void PacketAndLowLevelTestsTest::DestroyPeers()
|
|
{
|
|
|
|
int theSize=destroyList.Size();
|
|
|
|
for (int i=0; i < theSize; i++)
|
|
RakPeerInterface::DestroyInstance(destroyList[i]);
|
|
|
|
}
|
|
|
|
PacketAndLowLevelTestsTest::PacketAndLowLevelTestsTest(void)
|
|
{
|
|
|
|
errorList.Push("Client failed to connect to server",_FILE_AND_LINE_);
|
|
errorList.Push("Attached plugin failed to modify packet",_FILE_AND_LINE_);
|
|
errorList.Push("Plugin is still modifying packets after detach",_FILE_AND_LINE_);
|
|
errorList.Push("GetSplitMessageProgressInterval returned wrong value",_FILE_AND_LINE_);
|
|
errorList.Push("Send to server failed",_FILE_AND_LINE_);
|
|
errorList.Push("Large packet did not split or did not properly get ID_DOWNLOAD_PROGRESS after SetSplitMessageProgressInterval is set to 1 millisecond",_FILE_AND_LINE_);
|
|
errorList.Push("Did not recieve and put on packet made with AllocatePacket and put on recieve stack with PushBackPacket",_FILE_AND_LINE_);
|
|
errorList.Push("Client failed to connect to server",_FILE_AND_LINE_);
|
|
errorList.Push("Did not recieve all packets from SendList",_FILE_AND_LINE_);
|
|
errorList.Push("Did not recieve and put on packet made with AllocatePacket and put on recieve stack with PushBackPacket",_FILE_AND_LINE_);
|
|
errorList.Push("Client failed to connect to server",_FILE_AND_LINE_);
|
|
errorList.Push("PushBackPacket messed up future communication",_FILE_AND_LINE_);
|
|
errorList.Push("Send/Recieve failed",_FILE_AND_LINE_);
|
|
errorList.Push("Recieved size incorrect",_FILE_AND_LINE_);
|
|
|
|
}
|
|
|
|
PacketAndLowLevelTestsTest::~PacketAndLowLevelTestsTest(void)
|
|
{
|
|
}
|