mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 11:00:32 +00:00
Telepathy Tests added
This commit is contained in:
parent
4007423db2
commit
ab7c28ea91
8
Assets/Mirror/Tests/Editor/Telepathy.meta
Normal file
8
Assets/Mirror/Tests/Editor/Telepathy.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e6cfce0676b384a318f1670d9ce979f8
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
439
Assets/Mirror/Tests/Editor/Telepathy/TransportTest.cs
Normal file
439
Assets/Mirror/Tests/Editor/Telepathy/TransportTest.cs
Normal file
@ -0,0 +1,439 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using UnityEngine.TestTools;
|
||||||
|
|
||||||
|
namespace Telepathy.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class TransportTest
|
||||||
|
{
|
||||||
|
// just a random port that will hopefully not be taken
|
||||||
|
const int port = 9587;
|
||||||
|
|
||||||
|
Server server;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
server = new Server();
|
||||||
|
server.Start(port);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[TearDown]
|
||||||
|
public void TearDown()
|
||||||
|
{
|
||||||
|
server.Stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void NextConnectionIdTest()
|
||||||
|
{
|
||||||
|
// it should always start at '1', because '0' is reserved for
|
||||||
|
// Mirror's local player
|
||||||
|
int id = server.NextConnectionId();
|
||||||
|
Assert.That(id, Is.EqualTo(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DisconnectImmediateTest()
|
||||||
|
{
|
||||||
|
// telepathy will expect and log a ObjectDisposedException
|
||||||
|
LogAssert.ignoreFailingMessages = true;
|
||||||
|
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// I should be able to disconnect right away
|
||||||
|
// if connection was pending, it should just cancel
|
||||||
|
client.Disconnect();
|
||||||
|
|
||||||
|
Assert.That(client.Connected, Is.False);
|
||||||
|
Assert.That(client.Connecting, Is.False);
|
||||||
|
|
||||||
|
// restore
|
||||||
|
LogAssert.ignoreFailingMessages = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void SpamConnectTest()
|
||||||
|
{
|
||||||
|
// telepathy will expect and log a ObjectDisposedException
|
||||||
|
LogAssert.ignoreFailingMessages = true;
|
||||||
|
|
||||||
|
Client client = new Client();
|
||||||
|
for (int i = 0; i < 1000; i++)
|
||||||
|
{
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
Assert.That(client.Connecting || client.Connected, Is.True);
|
||||||
|
client.Disconnect();
|
||||||
|
Assert.That(client.Connected, Is.False);
|
||||||
|
Assert.That(client.Connecting, Is.False);
|
||||||
|
}
|
||||||
|
|
||||||
|
// restore
|
||||||
|
LogAssert.ignoreFailingMessages = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void SpamSendTest()
|
||||||
|
{
|
||||||
|
// BeginSend can't be called again after previous one finished. try
|
||||||
|
// to trigger that case.
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// wait for successful connection
|
||||||
|
Message connectMsg = NextMessage(client);
|
||||||
|
Assert.That(connectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
Assert.That(client.Connected, Is.True);
|
||||||
|
|
||||||
|
byte[] data = new byte[99999];
|
||||||
|
for (int i = 0; i < 1000; i++)
|
||||||
|
{
|
||||||
|
client.Send(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
client.Disconnect();
|
||||||
|
Assert.That(client.Connected, Is.False);
|
||||||
|
Assert.That(client.Connecting, Is.False);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ReconnectTest()
|
||||||
|
{
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// wait for successful connection
|
||||||
|
Message connectMsg = NextMessage(client);
|
||||||
|
Assert.That(connectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
// disconnect and lets try again
|
||||||
|
client.Disconnect();
|
||||||
|
Assert.That(client.Connected, Is.False);
|
||||||
|
Assert.That(client.Connecting, Is.False);
|
||||||
|
|
||||||
|
// connecting should flush message queue right?
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
// wait for successful connection
|
||||||
|
connectMsg = NextMessage(client);
|
||||||
|
Assert.That(connectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
client.Disconnect();
|
||||||
|
Assert.That(client.Connected, Is.False);
|
||||||
|
Assert.That(client.Connecting, Is.False);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ServerTest()
|
||||||
|
{
|
||||||
|
Encoding utf8 = Encoding.UTF8;
|
||||||
|
Client client = new Client();
|
||||||
|
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// we should first receive a connected message
|
||||||
|
Message connectMsg = NextMessage(server);
|
||||||
|
Assert.That(connectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
|
||||||
|
// then we should receive the data
|
||||||
|
client.Send(utf8.GetBytes("Hello world"));
|
||||||
|
Message dataMsg = NextMessage(server);
|
||||||
|
Assert.That(dataMsg.eventType, Is.EqualTo(EventType.Data));
|
||||||
|
string str = utf8.GetString(dataMsg.data);
|
||||||
|
Assert.That(str, Is.EqualTo("Hello world"));
|
||||||
|
|
||||||
|
// finally when the client disconnect, we should get a disconnected message
|
||||||
|
client.Disconnect();
|
||||||
|
Message disconnectMsg = NextMessage(server);
|
||||||
|
Assert.That(disconnectMsg.eventType, Is.EqualTo(EventType.Disconnected));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ClientTest()
|
||||||
|
{
|
||||||
|
Encoding utf8 = Encoding.UTF8;
|
||||||
|
Client client = new Client();
|
||||||
|
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// we should first receive a connected message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
int id = serverConnectMsg.connectionId;
|
||||||
|
|
||||||
|
// we should first receive a connected message
|
||||||
|
Message clientConnectMsg = NextMessage(client);
|
||||||
|
Assert.That(serverConnectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
|
||||||
|
// Send some data to the client
|
||||||
|
server.Send(id, utf8.GetBytes("Hello world"));
|
||||||
|
Message dataMsg = NextMessage(client);
|
||||||
|
Assert.That(dataMsg.eventType, Is.EqualTo(EventType.Data));
|
||||||
|
string str = utf8.GetString(dataMsg.data);
|
||||||
|
Assert.That(str, Is.EqualTo("Hello world"));
|
||||||
|
|
||||||
|
// finally if the server stops, the clients should get a disconnect error
|
||||||
|
server.Stop();
|
||||||
|
Message disconnectMsg = NextMessage(client);
|
||||||
|
Assert.That(disconnectMsg.eventType, Is.EqualTo(EventType.Disconnected));
|
||||||
|
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ServerDisconnectClientTest()
|
||||||
|
{
|
||||||
|
Client client = new Client();
|
||||||
|
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// we should first receive a connected message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
int id = serverConnectMsg.connectionId;
|
||||||
|
|
||||||
|
bool result = server.Disconnect(id);
|
||||||
|
Assert.That(result, Is.True);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ClientKickedCleanupTest()
|
||||||
|
{
|
||||||
|
Client client = new Client();
|
||||||
|
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// read connected message on client
|
||||||
|
Message clientConnectedMsg = NextMessage(client);
|
||||||
|
Assert.That(clientConnectedMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
|
||||||
|
// read connected message on server
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
int id = serverConnectMsg.connectionId;
|
||||||
|
|
||||||
|
// server kicks the client
|
||||||
|
bool result = server.Disconnect(id);
|
||||||
|
Assert.That(result, Is.True);
|
||||||
|
|
||||||
|
// wait for client disconnected message
|
||||||
|
Message clientDisconnectedMsg = NextMessage(client);
|
||||||
|
Assert.That(clientDisconnectedMsg.eventType, Is.EqualTo(EventType.Disconnected));
|
||||||
|
|
||||||
|
// was everything cleaned perfectly?
|
||||||
|
// if Connecting or Connected is still true then we wouldn't be able
|
||||||
|
// to reconnect otherwise
|
||||||
|
Assert.That(client.Connecting, Is.False);
|
||||||
|
Assert.That(client.Connected, Is.False);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetConnectionInfoTest()
|
||||||
|
{
|
||||||
|
// connect a client
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// get server's connect message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
Assert.That(serverConnectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
|
||||||
|
// get server's connection info for that client
|
||||||
|
string address = server.GetClientAddress(serverConnectMsg.connectionId);
|
||||||
|
Assert.That(address == "127.0.0.1" || address == "::ffff:127.0.0.1");
|
||||||
|
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
// all implementations should be able to handle 'localhost' as IP too
|
||||||
|
[Test]
|
||||||
|
public void ParseLocalHostTest()
|
||||||
|
{
|
||||||
|
// connect a client
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("localhost", port);
|
||||||
|
|
||||||
|
// get server's connect message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
Assert.That(serverConnectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
// IPv4 needs to work
|
||||||
|
[Test]
|
||||||
|
public void ConnectIPv4Test()
|
||||||
|
{
|
||||||
|
// connect a client
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// get server's connect message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
Assert.That(serverConnectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
// IPv6 needs to work
|
||||||
|
[Test]
|
||||||
|
public void ConnectIPv6Test()
|
||||||
|
{
|
||||||
|
// connect a client
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("::ffff:127.0.0.1", port);
|
||||||
|
|
||||||
|
// get server's connect message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
Assert.That(serverConnectMsg.eventType, Is.EqualTo(EventType.Connected));
|
||||||
|
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void LargeMessageTest()
|
||||||
|
{
|
||||||
|
// connect a client
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// we should first receive a connected message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
int id = serverConnectMsg.connectionId;
|
||||||
|
|
||||||
|
// Send largest allowed message
|
||||||
|
bool sent = client.Send(new byte[server.MaxMessageSize]);
|
||||||
|
Assert.That(sent, Is.EqualTo(true));
|
||||||
|
Message dataMsg = NextMessage(server);
|
||||||
|
Assert.That(dataMsg.eventType, Is.EqualTo(EventType.Data));
|
||||||
|
Assert.That(dataMsg.data.Length, Is.EqualTo(server.MaxMessageSize));
|
||||||
|
|
||||||
|
// finally if the server stops, the clients should get a disconnect error
|
||||||
|
server.Stop();
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AllocationAttackTest()
|
||||||
|
{
|
||||||
|
// connect a client
|
||||||
|
Client client = new Client();
|
||||||
|
client.Connect("127.0.0.1", port);
|
||||||
|
|
||||||
|
// we should first receive a connected message
|
||||||
|
Message serverConnectMsg = NextMessage(server);
|
||||||
|
int id = serverConnectMsg.connectionId;
|
||||||
|
|
||||||
|
// allow client to send large message
|
||||||
|
int attackSize = server.MaxMessageSize * 2;
|
||||||
|
client.MaxMessageSize = attackSize;
|
||||||
|
|
||||||
|
// Send a large message, bigger thank max message size
|
||||||
|
// -> this should disconnect the client
|
||||||
|
bool sent = client.Send(new byte[attackSize]);
|
||||||
|
Assert.That(sent, Is.EqualTo(true));
|
||||||
|
Message dataMsg = NextMessage(server);
|
||||||
|
Assert.That(dataMsg.eventType, Is.EqualTo(EventType.Disconnected));
|
||||||
|
|
||||||
|
// finally if the server stops, the clients should get a disconnect error
|
||||||
|
server.Stop();
|
||||||
|
client.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ServerStartStopTest()
|
||||||
|
{
|
||||||
|
// create a server that only starts and stops without ever accepting
|
||||||
|
// a connection
|
||||||
|
Server sv = new Server();
|
||||||
|
Assert.That(sv.Start(port + 1), Is.EqualTo(true));
|
||||||
|
Assert.That(sv.Active, Is.EqualTo(true));
|
||||||
|
sv.Stop();
|
||||||
|
Assert.That(sv.Active, Is.EqualTo(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ServerStartStopRepeatedTest()
|
||||||
|
{
|
||||||
|
// can we start/stop on the same port repeatedly?
|
||||||
|
Server sv = new Server();
|
||||||
|
for (int i = 0; i < 10; ++i)
|
||||||
|
{
|
||||||
|
Assert.That(sv.Start(port + 1), Is.EqualTo(true));
|
||||||
|
Assert.That(sv.Active, Is.EqualTo(true));
|
||||||
|
sv.Stop();
|
||||||
|
Assert.That(sv.Active, Is.EqualTo(false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void IntToBytesBigTest()
|
||||||
|
{
|
||||||
|
int number = 0x01020304;
|
||||||
|
|
||||||
|
byte[] numberBytes = Utils.IntToBytesBigEndian(number);
|
||||||
|
Assert.That(numberBytes[0], Is.EqualTo(0x01));
|
||||||
|
Assert.That(numberBytes[1], Is.EqualTo(0x02));
|
||||||
|
Assert.That(numberBytes[2], Is.EqualTo(0x03));
|
||||||
|
Assert.That(numberBytes[3], Is.EqualTo(0x04));
|
||||||
|
|
||||||
|
int converted = Utils.BytesToIntBigEndian(numberBytes);
|
||||||
|
Assert.That(converted, Is.EqualTo(number));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void IntToBytesBigNonAllocTest()
|
||||||
|
{
|
||||||
|
int number = 0x01020304;
|
||||||
|
|
||||||
|
byte[] numberBytes = new byte[4];
|
||||||
|
Utils.IntToBytesBigEndianNonAlloc(number, numberBytes);
|
||||||
|
Assert.That(numberBytes[0], Is.EqualTo(0x01));
|
||||||
|
Assert.That(numberBytes[1], Is.EqualTo(0x02));
|
||||||
|
Assert.That(numberBytes[2], Is.EqualTo(0x03));
|
||||||
|
Assert.That(numberBytes[3], Is.EqualTo(0x04));
|
||||||
|
|
||||||
|
int converted = Utils.BytesToIntBigEndian(numberBytes);
|
||||||
|
Assert.That(converted, Is.EqualTo(number));
|
||||||
|
}
|
||||||
|
|
||||||
|
static Message NextMessage(Server server)
|
||||||
|
{
|
||||||
|
Message message;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
while (!server.GetNextMessage(out message))
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
Thread.Sleep(100);
|
||||||
|
|
||||||
|
if (count >= 100)
|
||||||
|
{
|
||||||
|
Assert.Fail("The message did not get to the server");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Message NextMessage(Client client)
|
||||||
|
{
|
||||||
|
Message message;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
while (!client.GetNextMessage(out message))
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
Thread.Sleep(100);
|
||||||
|
|
||||||
|
if (count >= 100)
|
||||||
|
{
|
||||||
|
Assert.Fail("The message did not get to the client");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
11
Assets/Mirror/Tests/Editor/Telepathy/TransportTest.cs.meta
Normal file
11
Assets/Mirror/Tests/Editor/Telepathy/TransportTest.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b159477e0cd0646afb7de5fe60fa9daa
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Loading…
Reference in New Issue
Block a user