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

283 lines
6.7 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 "LocalIsConnectedTest.h"
/*
Description:
Tests
IsLocalIP
SendLoopback
GetConnectionState
GetLocalIP
GetInternalID
Success conditions:
All tests pass
Failure conditions:
Any test fails
RakPeerInterface Functions used, tested indirectly by its use:
Startup
SetMaximumIncomingConnections
Receive
DeallocatePacket
Send
RakPeerInterface Functions Explicitly Tested:
IsLocalIP
SendLoopback
GetConnectionState
GetLocalIP
GetInternalID
*/
int LocalIsConnectedTest::RunTest(DataStructures::List<RakString> params,bool isVerbose,bool noPauses)
{
RakPeerInterface *server,*client;
destroyList.Clear(false,_FILE_AND_LINE_);
server=RakPeerInterface::GetInstance();
destroyList.Push(server,_FILE_AND_LINE_);
client=RakPeerInterface::GetInstance();
destroyList.Push(client,_FILE_AND_LINE_);
client->Startup(1,&SocketDescriptor(),1);
server->Startup(1,&SocketDescriptor(60000,0),1);
server->SetMaximumIncomingConnections(1);
SystemAddress serverAddress;
serverAddress.SetBinaryAddress("127.0.0.1");
serverAddress.port=60000;
TimeMS entryTime=GetTimeMS();
bool lastConnect=false;
if (isVerbose)
printf("Testing GetConnectionState\n");
while(!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true)&&GetTimeMS()-entryTime<5000)
{
if(!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true,true,true,true))
{
lastConnect=client->Connect("127.0.0.1",serverAddress.port,0,0)==CONNECTION_ATTEMPT_STARTED;
}
RakSleep(100);
}
if (!lastConnect)//Use thise method to only check if the connect function fails, detecting connected client is done next
{
if (isVerbose)
DebugTools::ShowError("Client could not connect after 5 seconds\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 1;
}
if(!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true))
{
if (isVerbose)
DebugTools::ShowError("IsConnected did not detect connected client",!noPauses && isVerbose,__LINE__,__FILE__);
return 2;
}
client->CloseConnection (serverAddress,true,0,LOW_PRIORITY);
if(!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true,false,false,true))
{
DebugTools::ShowError("IsConnected did not detect disconnecting client",!noPauses && isVerbose,__LINE__,__FILE__);
return 3;
}
RakSleep(1000);
client->Connect("127.0.0.1",serverAddress.port,0,0);
if(!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true,true,true))
{
DebugTools::ShowError("IsConnected did not detect connecting client",!noPauses && isVerbose,__LINE__,__FILE__);
return 4;
}
entryTime=GetTimeMS();
while(!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true)&&GetTimeMS()-entryTime<5000)
{
if(!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true,true,true,true))
{
client->Connect("127.0.0.1",serverAddress.port,0,0);
}
RakSleep(100);
}
if (!CommonFunctions::ConnectionStateMatchesOptions (client,serverAddress,true))
{
if (isVerbose)
DebugTools::ShowError("Client could not connect after 5 seconds\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 1;
}
if (isVerbose)
printf("Testing IsLocalIP\n");
if (!client->IsLocalIP("127.0.0.1"))
{
if (isVerbose)
DebugTools::ShowError("IsLocalIP failed test\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 5;
}
if (isVerbose)
printf("Testing SendLoopback\n");
char str[]="AAAAAAAAAA";
str[0]=(char)(ID_USER_PACKET_ENUM+1);
client->SendLoopback(str, (int) strlen(str)+1);
client->SendLoopback(str, (int) strlen(str)+1);
client->SendLoopback(str, (int) strlen(str)+1);
client->SendLoopback(str, (int) strlen(str)+1);
client->SendLoopback(str, (int) strlen(str)+1);
client->SendLoopback(str, (int) strlen(str)+1);
client->SendLoopback(str, (int) strlen(str)+1);
bool recievedPacket=false;
Packet *packet;
TimeMS stopWaiting = GetTimeMS() + 1000;
while (GetTimeMS()<stopWaiting)
{
for (packet=client->Receive(); packet; client->DeallocatePacket(packet), packet=client->Receive())
{
if (packet->data[0]==ID_USER_PACKET_ENUM+1)
{
recievedPacket=true;
}
}
}
if (!recievedPacket)
{
if (isVerbose)
DebugTools::ShowError("SendLoopback failed test\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 6;
}
if (isVerbose)
printf("Testing GetLocalIP\n");
const char * localIp=client->GetLocalIP(0);
if (!client->IsLocalIP(localIp))
{
if (isVerbose)
DebugTools::ShowError("GetLocalIP failed test\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 7;
}
if (isVerbose)
printf("Testing GetInternalID\n");
SystemAddress localAddress=client->GetInternalID();
char convertedIp[39];
sprintf(convertedIp,"%d.%d.%d.%d", ((localAddress.binaryAddress >> (24 - 8 * 3)) & 0xFF),((localAddress.binaryAddress >> (24 - 16)) & 0xFF),((localAddress.binaryAddress >> (24 - 8 )) & 0xFF),((localAddress.binaryAddress >> (24)) & 0xFF));
printf("GetInternalID returned %s\n",convertedIp);
if (!client->IsLocalIP(convertedIp))
{
if (isVerbose)
DebugTools::ShowError("GetInternalID failed test\n",!noPauses && isVerbose,__LINE__,__FILE__);
return 8;
}
return 0;
}
RakString LocalIsConnectedTest::GetTestName()
{
return "LocalIsConnectedTest";
}
RakString LocalIsConnectedTest::ErrorCodeToString(int errorCode)
{
switch (errorCode)
{
case 0:
return "No error";
break;
case 1:
return "Client could not connect after 5 seconds";
break;
case 2:
return "IsConnected did not detect connected client";
break;
case 3:
return "IsConnected did not detect disconnecting client";
break;
case 4:
return "IsConnected did not detect connecting client";
break;
case 5:
return "IsLocalIP failed test";
break;
case 6:
return "Sendloopback failed test";
break;
case 7:
return "GetLocalIP failed test";
break;
case 8:
return "GetInternalID failed test";
break;
default:
return "Undefined Error";
}
}
LocalIsConnectedTest::LocalIsConnectedTest(void)
{
}
LocalIsConnectedTest::~LocalIsConnectedTest(void)
{
}
void LocalIsConnectedTest::DestroyPeers()
{
int theSize=destroyList.Size();
for (int i=0; i < theSize; i++)
RakPeerInterface::DestroyInstance(destroyList[i]);
}