The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Additional documentation and release notes are available at [Multiplayer Documentation](https://docs-multiplayer.unity3d.com). ## [1.5.2] - 2023-07-24 ### Added ### Fixed - Fixed issue where `NetworkClient.OwnedObjects` was not returning any owned objects due to the `NetworkClient.IsConnected` not being properly set. (#2631) - Fixed a crash when calling TrySetParent with a null Transform (#2625) - Fixed issue where a `NetworkTransform` using full precision state updates was losing transform state updates when interpolation was enabled. (#2624) - Fixed issue where `NetworkObject.SpawnWithObservers` was not being honored for late joining clients. (#2623) - Fixed issue where invoking `NetworkManager.Shutdown` multiple times, depending upon the timing, could cause an exception. (#2622) - Fixed issue where removing ownership would not notify the server that it gained ownership. This also resolves the issue where an owner authoritative NetworkTransform would not properly initialize upon removing ownership from a remote client. (#2618) - Fixed ILPP issues when using CoreCLR and for certain dedicated server builds. (#2614) - Fixed an ILPP compile error when creating a generic NetworkBehaviour singleton with a static T instance. (#2603) ### Changed
196 lines
6.4 KiB
C#
196 lines
6.4 KiB
C#
using NUnit.Framework;
|
|
using Unity.Netcode.Transports.UTP;
|
|
using UnityEngine;
|
|
using UnityEngine.TestTools;
|
|
|
|
namespace Unity.Netcode.EditorTests
|
|
{
|
|
public class UnityTransportTests
|
|
{
|
|
// Check that starting an IPv4 server succeeds.
|
|
[Test]
|
|
public void UnityTransport_BasicInitServer_IPv4()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
Assert.True(transport.StartServer());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that starting an IPv4 client succeeds.
|
|
[Test]
|
|
public void UnityTransport_BasicInitClient_IPv4()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
Assert.True(transport.StartClient());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that starting an IPv6 server succeeds.
|
|
[Test]
|
|
public void UnityTransport_BasicInitServer_IPv6()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
transport.SetConnectionData("::1", 7777);
|
|
|
|
Assert.True(transport.StartServer());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that starting an IPv6 client succeeds.
|
|
[Test]
|
|
public void UnityTransport_BasicInitClient_IPv6()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
transport.SetConnectionData("::1", 7777);
|
|
|
|
Assert.True(transport.StartClient());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that we can't restart a server.
|
|
[Test]
|
|
public void UnityTransport_NoRestartServer()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
transport.StartServer();
|
|
Assert.False(transport.StartServer());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that we can't restart a client.
|
|
[Test]
|
|
public void UnityTransport_NoRestartClient()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
transport.StartClient();
|
|
Assert.False(transport.StartClient());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that we can't start both a server and client on the same transport.
|
|
[Test]
|
|
public void UnityTransport_NotBothServerAndClient()
|
|
{
|
|
UnityTransport transport;
|
|
|
|
// Start server then client.
|
|
transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
transport.StartServer();
|
|
Assert.False(transport.StartClient());
|
|
|
|
transport.Shutdown();
|
|
|
|
// Start client then server.
|
|
transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
transport.StartClient();
|
|
Assert.False(transport.StartServer());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that restarting after failure succeeds.
|
|
[Test]
|
|
public void UnityTransport_RestartSucceedsAfterFailure()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
transport.SetConnectionData("127.0.0.", 4242, "127.0.0.");
|
|
|
|
Assert.False(transport.StartServer());
|
|
|
|
LogAssert.Expect(LogType.Error, "Invalid network endpoint: 127.0.0.:4242.");
|
|
LogAssert.Expect(LogType.Error, "Network listen address (127.0.0.) is Invalid!");
|
|
|
|
transport.SetConnectionData("127.0.0.1", 4242, "127.0.0.1");
|
|
Assert.True(transport.StartServer());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that leaving all addresses empty is valid.
|
|
[Test]
|
|
public void UnityTransport_StartServerWithoutAddresses()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
transport.SetConnectionData(string.Empty, 4242);
|
|
Assert.True(transport.StartServer());
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
// Check that StartClient returns false with bad connection data.
|
|
[Test]
|
|
public void UnityTransport_StartClientFailsWithBadAddress()
|
|
{
|
|
UnityTransport transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.Initialize();
|
|
|
|
transport.SetConnectionData("foobar", 4242);
|
|
Assert.False(transport.StartClient());
|
|
|
|
LogAssert.Expect(LogType.Error, "Invalid network endpoint: foobar:4242.");
|
|
LogAssert.Expect(LogType.Error, "Target server network address (foobar) is Invalid!");
|
|
|
|
transport.Shutdown();
|
|
}
|
|
|
|
#if UTP_TRANSPORT_2_0_ABOVE
|
|
[Test]
|
|
public void UnityTransport_EmptySecurityStringsShouldThrow([Values("", null)] string cert, [Values("", null)] string secret)
|
|
{
|
|
var supportingGO = new GameObject();
|
|
try
|
|
{
|
|
var networkManager = supportingGO.AddComponent<NetworkManager>(); // NM is required for UTP to work with certificates.
|
|
networkManager.NetworkConfig = new NetworkConfig();
|
|
UnityTransport transport = supportingGO.AddComponent<UnityTransport>();
|
|
networkManager.NetworkConfig.NetworkTransport = transport;
|
|
transport.Initialize();
|
|
transport.SetServerSecrets(serverCertificate: cert, serverPrivateKey: secret);
|
|
|
|
// Use encryption, but don't set certificate and check for exception
|
|
transport.UseEncryption = true;
|
|
Assert.Throws<System.Exception>(() =>
|
|
{
|
|
networkManager.StartServer();
|
|
});
|
|
// Make sure StartServer failed
|
|
Assert.False(transport.NetworkDriver.IsCreated);
|
|
Assert.False(networkManager.IsServer);
|
|
Assert.False(networkManager.IsListening);
|
|
}
|
|
finally
|
|
{
|
|
if (supportingGO != null)
|
|
{
|
|
Object.DestroyImmediate(supportingGO);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|