From f68a4f882a9fd890c6aa39657d5c26de717231cf Mon Sep 17 00:00:00 2001 From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com> Date: Mon, 24 Oct 2022 15:35:49 -0500 Subject: [PATCH 1/4] fix This fixes the issue where shutting down the server and the clients during a UnityTest would result in the player prefab getting deleted. --- .../TestHelpers/Runtime/NetcodeIntegrationTest.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs index c2f3dfe557..33692f79b6 100644 --- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs @@ -112,6 +112,7 @@ public enum HostOrServer } protected GameObject m_PlayerPrefab; + private NetworkManager m_PlayerPrefabMockNetworkManager; protected NetworkManager m_ServerNetworkManager; protected NetworkManager[] m_ClientNetworkManagers; @@ -250,6 +251,8 @@ private void CreatePlayerPrefab() // Make it a prefab NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(networkObject); + m_PlayerPrefabMockNetworkManager = new NetworkManager(); + networkObject.NetworkManagerOwner = m_PlayerPrefabMockNetworkManager; OnCreatePlayerPrefab(); @@ -583,6 +586,12 @@ protected void ShutdownAndCleanUp() Object.Destroy(m_PlayerPrefab); m_PlayerPrefab = null; } + + if (m_PlayerPrefabMockNetworkManager != null) + { + Object.Destroy(m_PlayerPrefabMockNetworkManager); + m_PlayerPrefabMockNetworkManager = null; + } } // Cleanup any remaining NetworkObjects From 2be17e49125567f51fa19e879d13d19c23ad0b80 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com> Date: Mon, 24 Oct 2022 15:37:24 -0500 Subject: [PATCH 2/4] style adding comments --- .../TestHelpers/Runtime/NetcodeIntegrationTest.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs index 33692f79b6..2052016030 100644 --- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs @@ -112,6 +112,8 @@ public enum HostOrServer } protected GameObject m_PlayerPrefab; + // This is used to prevent the player prefab from getting destroyed if a UnityTest + // shuts down the NetworkManager assigned to the NetworkManager.Singleton private NetworkManager m_PlayerPrefabMockNetworkManager; protected NetworkManager m_ServerNetworkManager; protected NetworkManager[] m_ClientNetworkManagers; @@ -586,7 +588,7 @@ protected void ShutdownAndCleanUp() Object.Destroy(m_PlayerPrefab); m_PlayerPrefab = null; } - + // Destroy the mock NetworkManager if (m_PlayerPrefabMockNetworkManager != null) { Object.Destroy(m_PlayerPrefabMockNetworkManager); From 8860874e8652328b9df24397de3aa8d34fdaa77a Mon Sep 17 00:00:00 2001 From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com> Date: Mon, 24 Oct 2022 16:19:46 -0500 Subject: [PATCH 3/4] fix This fix includes preserving any prefabs created with NetcodeIntegrationTest.CreateNetworkObjectPrefab --- .../TestHelpers/Runtime/NetcodeIntegrationTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs b/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs index 2052016030..0866783da8 100644 --- a/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs +++ b/com.unity.netcode.gameobjects/TestHelpers/Runtime/NetcodeIntegrationTest.cs @@ -842,7 +842,7 @@ protected GameObject CreateNetworkObjectPrefab(string baseName) var gameObject = new GameObject(); gameObject.name = baseName; var networkObject = gameObject.AddComponent(); - networkObject.NetworkManagerOwner = m_ServerNetworkManager; + networkObject.NetworkManagerOwner = m_PlayerPrefabMockNetworkManager; NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(networkObject); var networkPrefab = new NetworkPrefab() { Prefab = gameObject }; m_ServerNetworkManager.NetworkConfig.NetworkPrefabs.Add(networkPrefab); From 8c128aa352d84c3978a9bbcbd4729761e352caf3 Mon Sep 17 00:00:00 2001 From: NoelStephensUnity <73188597+NoelStephensUnity@users.noreply.github.com> Date: Mon, 24 Oct 2022 16:20:12 -0500 Subject: [PATCH 4/4] test This validates the updates to NetcodeIntegrationTest --- .../PreserveIntegrationTestPrefabs.cs | 76 +++++++++++++++++++ .../PreserveIntegrationTestPrefabs.cs.meta | 11 +++ 2 files changed, 87 insertions(+) create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs create mode 100644 com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs.meta diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs new file mode 100644 index 0000000000..1798475aed --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs @@ -0,0 +1,76 @@ +using System.Collections; +using System.Collections.Generic; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.TestTools; +using Unity.Netcode.TestHelpers.Runtime; + +namespace Unity.Netcode.RuntimeTests +{ + [TestFixture(HostOrServer.Host)] + [TestFixture(HostOrServer.Server)] + public class PreserveIntegrationTestPrefabs : NetcodeIntegrationTest + { + protected override int NumberOfClients => 2; + + private List m_Prefabs = new List(); + + public PreserveIntegrationTestPrefabs(HostOrServer hostOrServer) + { + m_UseHost = hostOrServer == HostOrServer.Host; + } + + protected override void OnServerAndClientsCreated() + { + m_Prefabs.Add(CreateNetworkObjectPrefab("TestPrefab1")); + m_Prefabs.Add(CreateNetworkObjectPrefab("TestPrefab2")); + } + + private void CheckPrefabs(bool beforeShutdown = true) + { + var beforOrAfterLabel = beforeShutdown ? "Before Shutdown" : "After Shutdown"; + Assert.True(m_ServerNetworkManager.NetworkConfig.PlayerPrefab != null, $"[{beforeShutdown}][Server] Player prefab is null!"); + for (int i = 0; i < NumberOfClients; i++) + { + Assert.True(m_ClientNetworkManagers[i].NetworkConfig.PlayerPrefab != null, $"[{beforeShutdown}][Client NetworkManager-{i}] Player prefab is null!"); + } + } + + private bool ServerAndClientsShutdown() + { + if (m_ServerNetworkManager.ShutdownInProgress) + { + return false; + } + + for (int i = 0; i < NumberOfClients; i++) + { + if (m_ClientNetworkManagers[i].ShutdownInProgress) + { + return false; + } + } + return true; + } + + [UnityTest] + public IEnumerator PreservePrefabsDuringShutdown() + { + CheckPrefabs(); + m_ServerNetworkManager.Shutdown(); + m_ClientNetworkManagers[0].Shutdown(); + m_ClientNetworkManagers[1].Shutdown(); + + yield return WaitForConditionOrTimeOut(ServerAndClientsShutdown); + AssertOnTimeout("Timed out waiting for the server and all clients to shutdown!"); + + m_ServerNetworkManager.StartHost(); + m_ClientNetworkManagers[0].StartClient(); + m_ClientNetworkManagers[1].StartClient(); + + yield return WaitForClientsConnectedOrTimeOut(); + + CheckPrefabs(); + } + } +} diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs.meta b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs.meta new file mode 100644 index 0000000000..567206308f --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Runtime/TestHelpers/PreserveIntegrationTestPrefabs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 883bc94f69382144e96902c696ecf24b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: