From f75ee37efbd60cae6369b6bb86b630d9868518de Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Mon, 9 Nov 2026 11:22:29 -0600 Subject: [PATCH] fix: failing player tests in netcode.gameobjects (UUM-160259) Guard the DEBUG-only message size check and UnityTransport warning in their tests, and add a regression test that ownership changes keep every instance registered with ObjectNameIdentifier. --- .../Runtime/Messaging/NamedMessageTests.cs | 3 + .../Runtime/Messaging/UnnamedMessageTests.cs | 3 + .../ObjectNameIdentifierTests.cs | 58 +++++++++++++++++++ .../ObjectNameIdentifierTests.cs.meta | 11 ++++ .../Runtime/Transports/UnityTransportTests.cs | 2 + 5 files changed, 77 insertions(+) create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs.meta diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs index 28ab33223e..8d11a73c16 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs @@ -243,6 +243,9 @@ public void WhenSendingNamedMessageToNullClientList_ArgumentNullExceptionIsThrow [Test] public unsafe void ErrorMessageIsPrintedWhenAttemptingToSendNamedMessageWithTooBigBuffer() { +#if !DEBUG + Assert.Ignore("The message size check only exists in builds that define DEBUG."); +#endif // First try a valid send with the maximum allowed size (this is atm 1264) var msgSize = m_ServerNetworkManager.MessageManager.NonFragmentedMessageMaxSize - FastBufferWriter.GetWriteSize() - sizeof(ulong)/*MessageName hash*/ - sizeof(NetworkBatchHeader); var bufferSize = m_ServerNetworkManager.MessageManager.NonFragmentedMessageMaxSize; diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/UnnamedMessageTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/UnnamedMessageTests.cs index 8b0c854b59..1c8c8263db 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/UnnamedMessageTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Messaging/UnnamedMessageTests.cs @@ -198,6 +198,9 @@ public void WhenSendingNamedMessageToNullClientList_ArgumentNullExceptionIsThrow [Test] public unsafe void ErrorMessageIsPrintedWhenAttemptingToSendUnnamedMessageWithTooBigBuffer() { +#if !DEBUG + Assert.Ignore("The message size check only exists in builds that define DEBUG."); +#endif // First try a valid send with the maximum allowed size (this is atm 1272) var msgSize = m_ServerNetworkManager.MessageManager.NonFragmentedMessageMaxSize - FastBufferWriter.GetWriteSize() - sizeof(NetworkBatchHeader); var bufferSize = m_ServerNetworkManager.MessageManager.NonFragmentedMessageMaxSize; diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs new file mode 100644 index 0000000000..778cee7fca --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs @@ -0,0 +1,58 @@ +using System.Collections; +using System.Text; +using NUnit.Framework; +using Unity.Netcode.TestHelpers.Runtime; +using UnityEngine; +using UnityEngine.TestTools; + +namespace Unity.Netcode.RuntimeTests +{ + internal class ObjectNameIdentifierTests : NetcodeIntegrationTest + { + protected override int NumberOfClients => 1; + + private GameObject m_Prefab; + + protected override void OnServerAndClientsCreated() + { + m_Prefab = CreateNetworkObjectPrefab("TrackedObject"); + base.OnServerAndClientsCreated(); + } + + private bool AllInstancesAreRegistered(StringBuilder errorLog, ulong networkObjectId) + { + foreach (var networkManager in m_NetworkManagers) + { + if (!s_GlobalNetworkObjects.TryGetValue(networkManager.LocalClientId, out var networkObjects) || !networkObjects.ContainsKey(networkObjectId)) + { + errorLog.Append($"[Client-{networkManager.LocalClientId}] Object-{networkObjectId} is not registered."); + return false; + } + } + return true; + } + + [UnityTest] + public IEnumerator OwnershipChangesKeepAllInstancesRegistered() + { + var authority = GetAuthorityNetworkManager(); + var client = m_ClientNetworkManagers[0]; + var authorityInstance = SpawnObject(m_Prefab, authority).GetComponent(); + var networkObjectId = authorityInstance.NetworkObjectId; + yield return WaitForSpawnedOnAllOrTimeOut(authorityInstance); + AssertOnTimeout($"Timed out waiting for Object-{networkObjectId} to spawn on all instances!"); + + authorityInstance.ChangeOwnership(client.LocalClientId); + yield return WaitForConditionOrTimeOut(() => client.SpawnManager.SpawnedObjects[networkObjectId].OwnerClientId == client.LocalClientId); + AssertOnTimeout($"Timed out waiting for Client-{client.LocalClientId} to gain ownership of Object-{networkObjectId}!"); + var errorLog = new StringBuilder(); + Assert.IsTrue(AllInstancesAreRegistered(errorLog, networkObjectId), $"After gaining ownership: {errorLog}"); + + authorityInstance.RemoveOwnership(); + yield return WaitForConditionOrTimeOut(() => client.SpawnManager.SpawnedObjects[networkObjectId].OwnerClientId == authority.LocalClientId); + AssertOnTimeout($"Timed out waiting for the authority to regain ownership of Object-{networkObjectId}!"); + errorLog.Clear(); + Assert.IsTrue(AllInstancesAreRegistered(errorLog, networkObjectId), $"After removing ownership: {errorLog}"); + } + } +} diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs.meta new file mode 100644 index 0000000000..bde5e655da --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/NetworkObject/ObjectNameIdentifierTests.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17d56b26ccea49e09cc90aa82c506f61 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs index 9b224d6bfe..c4212cb729 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs @@ -569,7 +569,9 @@ public IEnumerator DoesNotActAfterShutdown([Values] AfterShutdownAction afterShu { m_Server.DisconnectRemoteClient(m_Client1.ServerClientId); +#if DEBUG LogAssert.Expect(LogType.Warning, $"{nameof(UnityTransport.DisconnectRemoteClient)} should only be called on a listening server!"); +#endif } else if (afterShutdownAction == AfterShutdownAction.DisconnectLocalClient) {