Files
SLikeNet/Samples/Tests/OfflineMessagesConvertTest.cpp
2025-11-24 14:19:51 +05:30

254 lines
6.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 "OfflineMessagesConvertTest.h"
/*
Description:
Description: Tests / Demonstrates sending messages to systems you are not connected to.
Success conditions:
Proper offline response.
Proper offline ping response.
Failure conditions:
Any success conditions failed
RakPeerInterface Functions used, tested indirectly by its use:
GetGuidFromSystemAddress
Startup
SetMaximumIncomingConnections
Receive
DeallocatePacket
RakPeerInterface Functions Explicitly Tested:
SetOfflinePingResponse
GetOfflinePingResponse
AdvertiseSystem
Ping
*/
int OfflineMessagesConvertTest::RunTest(DataStructures::List<RakString> params,bool isVerbose,bool noPauses)
{
bool recievedProperOfflineData=false;
bool recievedProperPingData=false;
int nextTest;
destroyList.Clear(false,_FILE_AND_LINE_);
RakPeerInterface *peer1=RakPeerInterface::GetInstance();
destroyList.Push( peer1,_FILE_AND_LINE_);
RakPeerInterface *peer2=RakPeerInterface::GetInstance();
destroyList.Push(peer2,_FILE_AND_LINE_);
bool sentPacket=false;
nextTest=0;
peer1->SetMaximumIncomingConnections(1);
SocketDescriptor socketDescriptor(60001, 0);
peer1->Startup(1, &socketDescriptor, 1);
socketDescriptor.port=60002;
peer2->Startup(1, &socketDescriptor, 1);
char * pingResponseData=0;
unsigned int responseLen=0;
peer1->SetOfflinePingResponse("Offline Ping Data", (int)strlen("Offline Ping Data")+1);
peer1->GetOfflinePingResponse(&pingResponseData,&responseLen);
if(strcmp(pingResponseData,"Offline Ping Data")!=0)
{
if (isVerbose)
DebugTools::ShowError("GetOfflinePingResponse failed.\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 5;
}
if (isVerbose)
printf("Peer 1 guid = %s\n", peer1->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS).ToString());
if (isVerbose)
printf("Peer 2 guid = %s\n", peer2->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS).ToString());
if (isVerbose)
printf("Systems started. Waiting for advertise system packet\n");
// Wait for connection to complete
RakSleep(300);
if (isVerbose)
printf("Sending advertise system from %s\n", peer1->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS).ToString());
peer1->AdvertiseSystem("127.0.0.1", 60002,"hello world", (int)strlen("hello world")+1);
TimeMS entryTime=GetTimeMS();//Loop entry time
while (nextTest!=2&&GetTimeMS()-entryTime<10000)// run for 10 seconds
{
peer1->DeallocatePacket(peer1->Receive());
Packet *packet = peer2->Receive();
if (packet)
{
if (packet->data[0]==ID_ADVERTISE_SYSTEM)
{
if (packet->length>1)
{
if (isVerbose)
printf("Got Advertise system with data: %s\n", packet->data+1);
if(strcmp((const char*)(packet->data+1),"hello world")==0)
{
recievedProperOfflineData=true;
}
else
{
if (isVerbose)
DebugTools::ShowError("Got Advertise system with unexpected data\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 1;
}
}
else
{
if (isVerbose)
DebugTools::ShowError("Got Advertise system with unexpected data\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 1;
}
if (isVerbose)
printf("Was sent from GUID %s\n", packet->guid.ToString());
if (isVerbose)
printf("Sending ping from %s\n", peer2->GetGuidFromSystemAddress(UNASSIGNED_SYSTEM_ADDRESS).ToString());
peer2->Ping("127.0.0.1", 60001, false);
nextTest++;
}
else if (packet->data[0]==ID_UNCONNECTED_PONG)
{
// Peer or client. Response from a ping for an unconnected system.
TimeMS packetTime, dataLength;
TimeMS curTime = GetTimeMS();
memcpy( ( char* ) & packetTime, packet->data + sizeof( unsigned char ), sizeof( TimeMS ) );
dataLength = packet->length - sizeof( unsigned char ) - sizeof( TimeMS );
if (peer2->IsLocalIP(packet->systemAddress.ToString(false)))
{
if (isVerbose)
printf("ID_UNCONNECTED_PONG from our own");
}
else
{
if (isVerbose)
printf( "ID_UNCONNECTED_PONG from");
}
if (isVerbose)
{
printf(" %s on %p.\nPing is %i\nData is %i bytes long.\n", packet->systemAddress.ToString(), peer2, curTime-packetTime, dataLength );
printf("Was sent from GUID %s\n", packet->guid.ToString());
}
const char * recString=(const char *)(packet->data + sizeof( unsigned char ) + sizeof( TimeMS ));
if ( dataLength > 0 )
{
printf( "Data is %s\n",recString );
if (strcmp(recString, "Offline Ping Data")!=0)
{
if (isVerbose)
DebugTools::ShowError("Received wrong offline ping response\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 2;
}
recievedProperPingData=true;
}
nextTest++;
// ProcessUnhandledPacket(packet, ID_UNCONNECTED_PONG,interfaceType);
}
peer2->DeallocatePacket(packet);
}
RakSleep(30);
}
if (!recievedProperOfflineData)
{
if (isVerbose)
DebugTools::ShowError("Never got proper offline data\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 3;
}
if (!recievedProperPingData)
{
if (isVerbose)
DebugTools::ShowError("Never got proper ping data\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 4;
}
return 0;
}
RakString OfflineMessagesConvertTest::GetTestName()
{
return "OfflineMessagesConvertTest";
}
RakString OfflineMessagesConvertTest::ErrorCodeToString(int errorCode)
{
switch (errorCode)
{
case 0:
return "No error";
break;
case 1:
return "Unexpected advertise data";
break;
case 2:
return "Wrong ping response";
break;
case 3:
return "Never got proper offline data";
break;
case 4:
return "Never got proper ping data";
break;
case 5:
return "GetOfflinePingResponse failed.";
break;
default:
return "Undefined Error";
}
}
OfflineMessagesConvertTest::OfflineMessagesConvertTest(void)
{
}
OfflineMessagesConvertTest::~OfflineMessagesConvertTest(void)
{
}
void OfflineMessagesConvertTest::DestroyPeers()
{
int theSize=destroyList.Size();
for (int i=0; i < theSize; i++)
RakPeerInterface::DestroyInstance(destroyList[i]);
}