您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

275 行
12 KiB

using NUnit.Framework;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Networking.Transport.Protocols;
using Unity.Networking.Transport.Relay;
namespace Unity.Networking.Transport.Tests
{
public class RelayNetworkDriverTests
{
private ushort m_port = 1234;
[Test]
public void RelayCheckStructSizes()
{
Assert.AreEqual(RelayMessageHeader.Length, UnsafeUtility.SizeOf<RelayMessageHeader>());
Assert.AreEqual(RelayAllocationId.k_Length, UnsafeUtility.SizeOf<RelayAllocationId>());
Assert.AreEqual(RelayMessageAccepted.Length, UnsafeUtility.SizeOf<RelayMessageAccepted>());
Assert.AreEqual(RelayMessageConnectRequest.Length, UnsafeUtility.SizeOf<RelayMessageConnectRequest>());
Assert.AreEqual(RelayMessageDisconnect.Length, UnsafeUtility.SizeOf<RelayMessageDisconnect>());
Assert.AreEqual(RelayMessagePing.Length, UnsafeUtility.SizeOf<RelayMessagePing>());
Assert.AreEqual(RelayMessageRelay.Length, UnsafeUtility.SizeOf<RelayMessageRelay>());
Assert.AreEqual(RelayConnectionData.k_Length, UnsafeUtility.SizeOf<RelayConnectionData>());
Assert.AreEqual(RelayHMACKey.k_Length, UnsafeUtility.SizeOf<RelayHMACKey>());
}
[Test]
public void RelayNetworkDriver_Bind_Succeed()
{
using (var server = new RelayServerMock("127.0.0.1", m_port++))
using (var driver = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0), RelayConnectionTimeMS = 10000000 }))
{
server.SetupForBind();
Assert.Zero(driver.Bind(NetworkEndPoint.AnyIpv4));
driver.ScheduleUpdate(default).Complete();
RelayServerMock.WaitForCondition(() =>
{
driver.ScheduleUpdate().Complete();
return driver.Bound;
});
Assert.IsTrue(driver.Bound);
}
}
[Test]
public void RelayNetworkDriver_Bind_Retry()
{
const int k_RetryCount = 10;
using (var server = new RelayServerMock("127.0.0.1", m_port++))
using (var driver = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(),
new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0)},
new NetworkConfigParameter
{
maxConnectAttempts = NetworkParameterConstants.MaxConnectAttempts,
connectTimeoutMS = 50,
disconnectTimeoutMS = NetworkParameterConstants.DisconnectTimeoutMS,
maxFrameTimeMS = 0
}))
{
var retriesLeft = k_RetryCount;
server.SetupForBindRetry(k_RetryCount, () => --retriesLeft);
Assert.Zero(driver.Bind(NetworkEndPoint.AnyIpv4));
driver.ScheduleFlushSend(default).Complete();
RelayServerMock.WaitForCondition(() =>
{
driver.ScheduleUpdate().Complete();
return driver.Bound;
});
Assert.IsTrue(retriesLeft <= 0);
Assert.IsTrue(driver.Bound);
}
}
[Test]
public void RelayNetworkDriver_Listen_Succeed()
{
using (var server = new RelayServerMock("127.0.0.1", m_port++))
using (var host = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0), RelayConnectionTimeMS = 10000000 }))
{
host.Bind(NetworkEndPoint.AnyIpv4);
Assert.True(server.CompleteBind(host));
Assert.Zero(host.Listen());
}
}
[Test]
public void RelayNetworkDriver_ListenWithUnbound_Fail()
{
using (var server = new RelayServerMock("127.0.0.1", m_port++))
using (var host = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0), RelayConnectionTimeMS = 10000000 }))
{
host.Bind(NetworkEndPoint.AnyIpv4);
Assert.IsFalse(host.Bound);
Assert.Throws<System.InvalidOperationException>(() =>
{
host.Listen();
});
}
}
[Test]
public void RelayNetworkDriver_Connect_Succeed()
{
using (var server = new RelayServerMock("127.0.0.1", m_port++))
using (var host = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0), RelayConnectionTimeMS = 10000000 }))
using (var client = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(1), RelayConnectionTimeMS = 10000000 }))
{
host.Bind(NetworkEndPoint.AnyIpv4);
Assert.True(server.CompleteBind(host, 0));
client.Bind(NetworkEndPoint.AnyIpv4);
Assert.True(server.CompleteBind(client, 1));
Assert.Zero(host.Listen());
server.SetupForConnect(1);
var clientToHost = client.Connect(server.GetRelayConnectionData(0).Endpoint);
Assert.AreNotEqual(default(NetworkConnection), clientToHost);
RelayServerMock.WaitForCondition(() =>
{
client.ScheduleUpdate(default).Complete();
host.ScheduleUpdate(default).Complete();
return client.GetConnectionState(clientToHost) == NetworkConnection.State.Connected;
});
Assert.AreEqual(NetworkConnection.State.Connected, client.GetConnectionState(clientToHost));
var evt = client.PopEvent(out var clientToHostConnected, out var reader);
Assert.AreEqual(NetworkEvent.Type.Connect, evt);
Assert.AreEqual(clientToHost, clientToHostConnected);
Assert.AreEqual(NetworkEvent.Type.Empty, host.PopEvent(out clientToHostConnected, out reader));
var hostToClient = host.Accept();
Assert.AreNotEqual(default(NetworkConnection), hostToClient);
Assert.AreEqual(NetworkConnection.State.Connected, host.GetConnectionState(hostToClient));
}
}
[Test]
public void RelayNetworkDriver_Connect_Retry()
{
const int k_RetryCount = 10;
using (var server = new RelayServerMock("127.0.0.1", m_port++))
using (var host = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0), RelayConnectionTimeMS = 10000000 }))
using (var client = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(),
new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(1)},
new NetworkConfigParameter
{
maxConnectAttempts = NetworkParameterConstants.MaxConnectAttempts,
connectTimeoutMS = 50,
disconnectTimeoutMS = NetworkParameterConstants.DisconnectTimeoutMS,
maxFrameTimeMS = 0
}))
{
host.Bind(NetworkEndPoint.AnyIpv4);
Assert.True(server.CompleteBind(host, 0));
client.Bind(NetworkEndPoint.AnyIpv4);
Assert.True(server.CompleteBind(client, 1));
Assert.Zero(host.Listen());
var retriesLeft = k_RetryCount;
server.SetupForConnectRetry(1, k_RetryCount, () => --retriesLeft);
var clientToHost = client.Connect(server.GetRelayConnectionData(0).Endpoint);
Assert.AreNotEqual(default(NetworkConnection), clientToHost);
RelayServerMock.WaitForCondition(() =>
{
client.ScheduleUpdate(default).Complete();
host.ScheduleUpdate(default).Complete();
return client.GetConnectionState(clientToHost) == NetworkConnection.State.Connected;
});
Assert.LessOrEqual(0, retriesLeft);
Assert.AreEqual(NetworkConnection.State.Connected, client.GetConnectionState(clientToHost));
var evt = client.PopEvent(out var clientToHostConnected, out var reader);
Assert.AreEqual(NetworkEvent.Type.Connect, evt);
Assert.AreEqual(clientToHost, clientToHostConnected);
Assert.AreEqual(NetworkEvent.Type.Empty, host.PopEvent(out clientToHostConnected, out reader));
var hostToClient = host.Accept();
Assert.AreNotEqual(default(NetworkConnection), hostToClient);
Assert.AreEqual(NetworkConnection.State.Connected, host.GetConnectionState(hostToClient));
}
}
[Test]
public void RelayNetworkDriver_Disconnect_Succeed()
{
//using (var server = new RelayServerMock("127.0.0.1", m_port++))
//using (var host = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(),new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0) }))
//using (var client = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(),new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(1) })) {
// Assert.True(server.CompleteConnect(host, out var connections, client));
// var connection = connections[0];
// server.SetupForDisconnect(1, 0);
// Assert.AreEqual(NetworkConnection.State.Connected, client.GetConnectionState(connections[0].clientToHost));
// Assert.AreEqual(NetworkConnection.State.Connected, host.GetConnectionState(connections[0].hostToClient));
// Assert.Zero(client.Disconnect(connections[0].clientToHost));
// RelayServerMock.WaitForCondition(() =>
// {
// client.ScheduleUpdate(default).Complete();
// host.ScheduleUpdate(default).Complete();
// return host.GetConnectionState(connections[0].hostToClient) == NetworkConnection.State.Disconnected;
// });
// Assert.AreEqual(NetworkConnection.State.Disconnected, client.GetConnectionState(connections[0].clientToHost));
// Assert.AreEqual(NetworkConnection.State.Disconnected, host.GetConnectionState(connections[0].hostToClient));
//}
}
[Test]
public void RelayNetworkDriver_Send_Succeed()
{
const int k_PayloadSize = 100;
using (var server = new RelayServerMock("127.0.0.1", m_port++))
using (var host = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(0), RelayConnectionTimeMS = 10000000 }))
using (var client = new NetworkDriver(new BaselibNetworkInterface(), new RelayNetworkProtocol(), new RelayNetworkParameter { ServerData = server.GetRelayConnectionData(1), RelayConnectionTimeMS = 10000000 }))
{
Assert.True(server.CompleteConnect(host, out var connections, client));
var connection = connections[0];
server.SetupForRelay(1, 0, k_PayloadSize + UdpCHeader.Length);
Assert.Zero(client.BeginSend(connection.clientToHost, out var writer, k_PayloadSize));
for (int i = 0; i < k_PayloadSize; i++)
{
writer.WriteByte((byte)i);
}
Assert.AreEqual(k_PayloadSize, client.EndSend(writer));
client.ScheduleFlushSend(default).Complete();
RelayServerMock.WaitForCondition(() =>
{
host.ScheduleUpdate(default).Complete();
return host.GetEventQueueSizeForConnection(connection.hostToClient) > 0;
});
Assert.AreEqual(NetworkEvent.Type.Data, host.PopEventForConnection(connection.hostToClient, out var reader));
for (int i = 0; i < k_PayloadSize; i++)
{
Assert.AreEqual((byte)i, reader.ReadByte());
}
}
}
}
}