From e0cbc952cf8690f39ba010f4cac320d9b2c13721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Mon, 30 Aug 2021 17:07:24 +0200 Subject: [PATCH 1/7] refactor!: Unified Shutdown BREAKING CHANGE: NetworkManager.StopX is replaced with NetworkManager.Shutdown --- .../Editor/NetworkManagerEditor.cs | 13 +- .../Runtime/Core/NetworkManager.cs | 149 +++++++----------- .../Transports/Tests/Editor/TransportTest.cs | 2 - .../NetworkManagerMessageHandlerTests.cs | 4 +- .../Runtime/Helpers/NetworkManagerHelper.cs | 22 +-- .../Tests/Runtime/MultiInstanceHelpers.cs | 15 +- .../Assets/Scripts/ExitButtonScript.cs | 13 +- .../Tests/Runtime/DontDestroyOnLoadTests.cs | 4 +- .../Runtime/MultiClientConnectionApproval.cs | 4 +- .../BaseMultiprocessTests.cs | 2 +- .../MultiprocessRuntime/TestCoordinator.cs | 2 +- .../Tests/Runtime/RpcINetworkSerializable.cs | 8 +- 12 files changed, 74 insertions(+), 164 deletions(-) diff --git a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs index 563a2eeabd..b8571efc07 100644 --- a/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs +++ b/com.unity.netcode.gameobjects/Editor/NetworkManagerEditor.cs @@ -388,18 +388,7 @@ public override void OnInspectorGUI() if (GUILayout.Button(new GUIContent("Stop " + instanceType, "Stops the " + instanceType + " instance."))) { - if (m_NetworkManager.IsHost) - { - m_NetworkManager.StopHost(); - } - else if (m_NetworkManager.IsServer) - { - m_NetworkManager.StopServer(); - } - else if (m_NetworkManager.IsClient) - { - m_NetworkManager.StopClient(); - } + m_NetworkManager.Shutdown(); } } } diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 0d3aa78b0b..0d1dc7d00c 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -748,94 +748,6 @@ public SocketTasks StartClient() return socketTasks; } - /// - /// Stops the running server - /// - public void StopServer() - { - if (NetworkLog.CurrentLogLevel <= LogLevel.Developer) - { - NetworkLog.LogInfo(nameof(StopServer)); - } - - var disconnectedIds = new HashSet(); - - //Don't know if I have to disconnect the clients. I'm assuming the NetworkTransport does all the cleaning on shtudown. But this way the clients get a disconnect message from server (so long it does't get lost) - - // make sure all messages are flushed before transport disconnect clients - if (MessageQueueContainer != null) - { - MessageQueueContainer.ProcessAndFlushMessageQueue( - queueType: MessageQueueContainer.MessageQueueProcessingTypes.Send, - NetworkUpdateStage.PostLateUpdate); // flushing messages in case transport's disconnect - } - - foreach (KeyValuePair pair in ConnectedClients) - { - if (!disconnectedIds.Contains(pair.Key)) - { - disconnectedIds.Add(pair.Key); - - if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId) - { - continue; - } - - NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key); - } - } - - foreach (KeyValuePair pair in PendingClients) - { - if (!disconnectedIds.Contains(pair.Key)) - { - disconnectedIds.Add(pair.Key); - if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId) - { - continue; - } - - NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key); - } - } - - IsServer = false; - Shutdown(); - } - - /// - /// Stops the running host - /// - public void StopHost() - { - if (NetworkLog.CurrentLogLevel <= LogLevel.Developer) - { - NetworkLog.LogInfo(nameof(StopHost)); - } - - IsServer = false; - IsClient = false; - StopServer(); - - //We don't stop client since we dont actually have a transport connection to our own host. We just handle host messages directly in the netcode - } - - /// - /// Stops the running client - /// - public void StopClient() - { - if (NetworkLog.CurrentLogLevel <= LogLevel.Developer) - { - NetworkLog.LogInfo(nameof(StopClient)); - } - - IsClient = false; - NetworkConfig.NetworkTransport.DisconnectLocalClient(); - IsConnectedClient = false; - Shutdown(); - } - /// /// Starts a Host /// @@ -964,6 +876,9 @@ private void OnDestroy() } } + /// + /// Global shtudown. Disconnects clients and stops server. + /// public void Shutdown() { if (NetworkLog.CurrentLogLevel <= LogLevel.Developer) @@ -971,6 +886,59 @@ public void Shutdown() NetworkLog.LogInfo(nameof(Shutdown)); } + if (IsServer) + { + var disconnectedIds = new HashSet(); + + //Don't know if I have to disconnect the clients. I'm assuming the NetworkTransport does all the cleaning on shtudown. But this way the clients get a disconnect message from server (so long it does't get lost) + + // make sure all messages are flushed before transport disconnect clients + if (MessageQueueContainer != null) + { + MessageQueueContainer.ProcessAndFlushMessageQueue( + queueType: MessageQueueContainer.MessageQueueProcessingTypes.Send, + NetworkUpdateStage.PostLateUpdate); // flushing messages in case transport's disconnect + } + + foreach (KeyValuePair pair in ConnectedClients) + { + if (!disconnectedIds.Contains(pair.Key)) + { + disconnectedIds.Add(pair.Key); + + if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId) + { + continue; + } + + NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key); + } + } + + foreach (KeyValuePair pair in PendingClients) + { + if (!disconnectedIds.Contains(pair.Key)) + { + disconnectedIds.Add(pair.Key); + if (pair.Key == NetworkConfig.NetworkTransport.ServerClientId) + { + continue; + } + + NetworkConfig.NetworkTransport.DisconnectRemoteClient(pair.Key); + } + } + } + else + { + // Client only, send disconnect to server + NetworkConfig.NetworkTransport.DisconnectLocalClient(); + } + + IsConnectedClient = false; + IsServer = false; + IsClient = false; + // Unregister INetworkUpdateSystem before shutting down the MessageQueueContainer this.UnregisterAllNetworkUpdates(); @@ -993,8 +961,6 @@ public void Shutdown() NetworkTickSystem = null; } - IsServer = false; - IsClient = false; NetworkConfig.NetworkTransport.OnTransportEvent -= HandleRawTransportPoll; if (SpawnManager != null) @@ -1223,8 +1189,7 @@ private void HandleRawTransportPoll(NetworkEvent networkEvent, ulong clientId, N } else { - IsConnectedClient = false; - StopClient(); + Shutdown(); } OnClientDisconnectCallback?.Invoke(clientId); diff --git a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs b/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs index c9d5b73600..de394dac23 100644 --- a/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs +++ b/com.unity.netcode.gameobjects/Runtime/Transports/Tests/Editor/TransportTest.cs @@ -47,7 +47,6 @@ public void UNetCustomChannelRegistrationTest() Assert.Fail("The UNet transport won't allow registration of a legit user channel"); } - nm.StopServer(); nm.Shutdown(); ut.Channels.Clear(); @@ -64,7 +63,6 @@ public void UNetCustomChannelRegistrationTest() Debug.Log(ex.Message); } - nm.StopServer(); nm.Shutdown(); } } diff --git a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs index 45727c22f8..68eef51ca0 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/NetworkManagerMessageHandlerTests.cs @@ -116,7 +116,7 @@ public void MessageHandlerReceivedMessageServerClient() networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream10.GetBuffer(), 0, (int)messageStream10.Length), 0); // Stop server to trigger full shutdown - networkManager.StopServer(); + networkManager.Shutdown(); // Replace the real message handler with a dummy one that just prints a result networkManager.MessageHandler = new DummyMessageHandler(networkManager); @@ -204,7 +204,7 @@ public void MessageHandlerReceivedMessageServerClient() networkManager.HandleIncomingData(0, NetworkChannel.Internal, new ArraySegment(messageStream21.GetBuffer(), 0, (int)messageStream21.Length), 0); // Full cleanup - networkManager.StopClient(); + networkManager.Shutdown(); // Ensure no missmatches with expectations LogAssert.NoUnexpectedReceived(); diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs index 91cbe0a571..5ac2a682df 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Helpers/NetworkManagerHelper.cs @@ -205,27 +205,7 @@ private static void StartNetworkManagerMode(NetworkManagerOperatingMode managerM /// private static void StopNetworkManagerMode() { - switch (CurrentNetworkManagerMode) - { - case NetworkManagerOperatingMode.Host: - { - // Stop the host - NetworkManagerObject.StopHost(); - break; - } - case NetworkManagerOperatingMode.Server: - { - // Stop the server - NetworkManagerObject.StopServer(); - break; - } - case NetworkManagerOperatingMode.Client: - { - // Stop the client - NetworkManagerObject.StopClient(); - break; - } - } + NetworkManagerObject.Shutdown(); Debug.Log($"{CurrentNetworkManagerMode} stopped."); CurrentNetworkManagerMode = NetworkManagerOperatingMode.None; diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs b/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs index c2eb731e19..1f2fb1a76a 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/MultiInstanceHelpers.cs @@ -93,7 +93,7 @@ public static bool CreateNewClients(int clientCount, out NetworkManager[] client /// public static void StopOneClient(NetworkManager clientToStop) { - clientToStop.StopClient(); + clientToStop.Shutdown(); Object.Destroy(clientToStop.gameObject); NetworkManagerInstances.Remove(clientToStop); } @@ -114,18 +114,7 @@ public static void Destroy() // Shutdown the server which forces clients to disconnect foreach (var networkManager in NetworkManagerInstances) { - if (networkManager.IsHost) - { - networkManager.StopHost(); - } - else if (networkManager.IsServer) - { - networkManager.StopServer(); - } - else if (networkManager.IsClient) - { - networkManager.StopClient(); - } + networkManager.Shutdown(); } // Destroy the network manager instances diff --git a/testproject/Assets/Scripts/ExitButtonScript.cs b/testproject/Assets/Scripts/ExitButtonScript.cs index 0195b39e93..8c6b135834 100644 --- a/testproject/Assets/Scripts/ExitButtonScript.cs +++ b/testproject/Assets/Scripts/ExitButtonScript.cs @@ -14,18 +14,7 @@ public void OnExitScene() { if (NetworkManager.Singleton) { - if (NetworkManager.Singleton.IsHost) - { - NetworkManager.Singleton.StopHost(); - } - else if (NetworkManager.Singleton.IsClient) - { - NetworkManager.Singleton.StopClient(); - } - else if (NetworkManager.Singleton.IsServer) - { - NetworkManager.Singleton.StopServer(); - } + NetworkManager.Singleton.Shutdown(); Destroy(NetworkManager.Singleton.gameObject); } diff --git a/testproject/Assets/Tests/Runtime/DontDestroyOnLoadTests.cs b/testproject/Assets/Tests/Runtime/DontDestroyOnLoadTests.cs index af5b381311..8c1fdcd944 100644 --- a/testproject/Assets/Tests/Runtime/DontDestroyOnLoadTests.cs +++ b/testproject/Assets/Tests/Runtime/DontDestroyOnLoadTests.cs @@ -59,10 +59,10 @@ public IEnumerator Setup() [UnityTearDown] public IEnumerator Teardown() { - m_ServerNetworkManager.StopHost(); + m_ServerNetworkManager.Shutdown(); foreach (var networkManager in m_ClientNetworkManagers) { - networkManager.StopClient(); + networkManager.Shutdown(); } int nextFrameNumber = Time.frameCount + 4; yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber); diff --git a/testproject/Assets/Tests/Runtime/MultiClientConnectionApproval.cs b/testproject/Assets/Tests/Runtime/MultiClientConnectionApproval.cs index 04b624fed3..ee1bea9f45 100644 --- a/testproject/Assets/Tests/Runtime/MultiClientConnectionApproval.cs +++ b/testproject/Assets/Tests/Runtime/MultiClientConnectionApproval.cs @@ -148,11 +148,11 @@ private IEnumerator ConnectionApprovalHandler(int numClients, int failureTestCou foreach (var client in clients) { - client.StopClient(); + client.Shutdown(); } server.ConnectionApprovalCallback -= ConnectionApprovalCallback; - server.StopHost(); + server.Shutdown(); Debug.Log($"Total frames updated = {Time.frameCount - startFrameCount} within {Time.realtimeSinceStartup - startTime} seconds."); } diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/BaseMultiprocessTests.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/BaseMultiprocessTests.cs index 7fd4980bb4..8771abffbd 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/BaseMultiprocessTests.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/BaseMultiprocessTests.cs @@ -90,7 +90,7 @@ public virtual void TeardownSuite() if (!ShouldIgnoreTests) { TestCoordinator.Instance.CloseRemoteClientRpc(); - NetworkManager.Singleton.StopHost(); + NetworkManager.Singleton.Shutdown(); Object.Destroy(NetworkManager.Singleton.gameObject); // making sure we clear everything before reloading our scene SceneManager.LoadScene(k_GlobalEmptySceneName); // using empty scene to clear our state } diff --git a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/TestCoordinator.cs b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/TestCoordinator.cs index b9ddc01220..863f0bcc96 100644 --- a/testproject/Assets/Tests/Runtime/MultiprocessRuntime/TestCoordinator.cs +++ b/testproject/Assets/Tests/Runtime/MultiprocessRuntime/TestCoordinator.cs @@ -292,7 +292,7 @@ public void CloseRemoteClientRpc() { try { - NetworkManager.Singleton.StopClient(); + NetworkManager.Singleton.Shutdown(); m_ShouldShutdown = true; // wait until isConnectedClient is false to run Application Quit in next update Debug.Log("Quitting player cleanly"); Application.Quit(); diff --git a/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs b/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs index 46e1484fc8..bda3c1c7cb 100644 --- a/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs +++ b/testproject/Assets/Tests/Runtime/RpcINetworkSerializable.cs @@ -87,8 +87,8 @@ public IEnumerator NetworkSerializableTest() } // End of test - m_ClientNetworkManagers[0].StopClient(); - m_ServerNetworkManager.StopHost(); + m_ClientNetworkManagers[0].Shutdown(); + m_ServerNetworkManager.Shutdown(); } /// @@ -209,8 +209,8 @@ public IEnumerator NetworkSerializableArrayTestHandler(int arraySize, bool sendN Assert.False(timedOut); // End of test - m_ClientNetworkManagers[0].StopClient(); - m_ServerNetworkManager.StopHost(); + m_ClientNetworkManagers[0].Shutdown(); + m_ServerNetworkManager.Shutdown(); } From 4a682ca96b75ef25eeb680346b46d2efcb52761a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Mon, 30 Aug 2021 17:16:08 +0200 Subject: [PATCH 2/7] Added tests --- .../Tests/Editor/StartStopTests.cs | 58 +++++++++++++++++++ .../Tests/Editor/StartStopTests.cs.meta | 3 + 2 files changed, 61 insertions(+) create mode 100644 com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs create mode 100644 com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs.meta diff --git a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs new file mode 100644 index 0000000000..ad89be5941 --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using NUnit.Framework; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace Unity.Netcode.EditorTests +{ + public class StartStopTests + { + [Test] + public void TestStopAndRestartForExceptions() + { + // Create the reusable NetworkManager + var singletonNetworkManager = new GameObject(nameof(NetworkManager)).AddComponent(); + var transport = singletonNetworkManager.gameObject.AddComponent(); + + singletonNetworkManager.NetworkConfig = new NetworkConfig() + { + RegisteredScenes = new List(){SceneManager.GetActiveScene().name}, + NetworkTransport = transport + }; + + // Start a normal server + singletonNetworkManager.StartServer(); + + // Ensure proper start + Assert.True(singletonNetworkManager.IsServer); + Assert.False(singletonNetworkManager.IsClient); + Assert.False(singletonNetworkManager.IsHost); + + // Shut it down. + singletonNetworkManager.Shutdown(); + + Assert.False(singletonNetworkManager.IsServer); + Assert.False(singletonNetworkManager.IsClient); + Assert.False(singletonNetworkManager.IsHost); + + // Restart + singletonNetworkManager.StartServer(); + + // Ensure everything is still normal after restart + Assert.True(singletonNetworkManager.IsServer); + Assert.False(singletonNetworkManager.IsClient); + Assert.False(singletonNetworkManager.IsHost); + + // Final shutdown + singletonNetworkManager.Shutdown(); + + // Ensure everything is shut down + Assert.False(singletonNetworkManager.IsServer); + Assert.False(singletonNetworkManager.IsClient); + Assert.False(singletonNetworkManager.IsHost); + + // Cleanup + Object.DestroyImmediate(singletonNetworkManager.gameObject); + } + } +} diff --git a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs.meta b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs.meta new file mode 100644 index 0000000000..6aee4ccc2b --- /dev/null +++ b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e8e36047cb5542bcaade2a9a8746d713 +timeCreated: 1630336158 \ No newline at end of file From ffe768bdfacd86319d56cc5d6443a3e9a4174250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Tue, 31 Aug 2021 17:23:42 +0200 Subject: [PATCH 3/7] Remove scene --- com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs index ad89be5941..caed16a9fe 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs @@ -16,7 +16,6 @@ public void TestStopAndRestartForExceptions() singletonNetworkManager.NetworkConfig = new NetworkConfig() { - RegisteredScenes = new List(){SceneManager.GetActiveScene().name}, NetworkTransport = transport }; From 334b21bd6a7d203ebaf8844a6e9bf0f9db1110ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Tue, 31 Aug 2021 17:44:40 +0200 Subject: [PATCH 4/7] Updated comments --- .../Runtime/Core/NetworkManager.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 2ea8b800b1..4e28562dd8 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -853,7 +853,8 @@ private void OnDestroy() } /// - /// Global shtudown. Disconnects clients and stops server. + /// Globally shuts down the library. + /// Disconnects clients if connected and stops server if running. /// public void Shutdown() { @@ -864,10 +865,6 @@ public void Shutdown() if (IsServer) { - var disconnectedIds = new HashSet(); - - //Don't know if I have to disconnect the clients. I'm assuming the NetworkTransport does all the cleaning on shtudown. But this way the clients get a disconnect message from server (so long it does't get lost) - // make sure all messages are flushed before transport disconnect clients if (MessageQueueContainer != null) { @@ -876,6 +873,10 @@ public void Shutdown() NetworkUpdateStage.PostLateUpdate); // flushing messages in case transport's disconnect } + var disconnectedIds = new HashSet(); + + //Don't know if I have to disconnect the clients. I'm assuming the NetworkTransport does all the cleaning on shutdown. But this way the clients get a disconnect message from server (so long it does't get lost) + foreach (KeyValuePair pair in ConnectedClients) { if (!disconnectedIds.Contains(pair.Key)) From 6c32cddfad67a0b04eea576f7cbf3cdc9edce4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Tue, 31 Aug 2021 17:46:41 +0200 Subject: [PATCH 5/7] Removed usings --- com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs index caed16a9fe..7287ccc0a5 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs @@ -1,7 +1,5 @@ -using System.Collections.Generic; using NUnit.Framework; using UnityEngine; -using UnityEngine.SceneManagement; namespace Unity.Netcode.EditorTests { From a0978113cac9f20ae9539923d54cbcf553ddb96b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Wed, 1 Sep 2021 17:56:59 +0200 Subject: [PATCH 6/7] Fixed invalid shutdown state --- com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs index 4e28562dd8..c53bfe7e92 100644 --- a/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs +++ b/com.unity.netcode.gameobjects/Runtime/Core/NetworkManager.cs @@ -906,7 +906,8 @@ public void Shutdown() } } } - else + + if (IsClient) { // Client only, send disconnect to server NetworkConfig.NetworkTransport.DisconnectLocalClient(); From e46cd0c7f762ef0d214004665cfe7c9286da5d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Cor=C3=A9n?= Date: Wed, 1 Sep 2021 22:38:04 +0200 Subject: [PATCH 7/7] Cleaned up test --- .../Tests/Editor/StartStopTests.cs | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs index 7287ccc0a5..9db67ae47e 100644 --- a/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Editor/StartStopTests.cs @@ -5,51 +5,58 @@ namespace Unity.Netcode.EditorTests { public class StartStopTests { - [Test] - public void TestStopAndRestartForExceptions() + private NetworkManager m_NetworkManager; + + [SetUp] + public void Setup() { // Create the reusable NetworkManager - var singletonNetworkManager = new GameObject(nameof(NetworkManager)).AddComponent(); - var transport = singletonNetworkManager.gameObject.AddComponent(); + m_NetworkManager = new GameObject(nameof(NetworkManager)).AddComponent(); + var transport = m_NetworkManager.gameObject.AddComponent(); - singletonNetworkManager.NetworkConfig = new NetworkConfig() + m_NetworkManager.NetworkConfig = new NetworkConfig() { NetworkTransport = transport }; + } - // Start a normal server - singletonNetworkManager.StartServer(); - - // Ensure proper start - Assert.True(singletonNetworkManager.IsServer); - Assert.False(singletonNetworkManager.IsClient); - Assert.False(singletonNetworkManager.IsHost); - - // Shut it down. - singletonNetworkManager.Shutdown(); + [Test] + public void TestStopAndRestartForExceptions() + { + m_NetworkManager.StartServer(); + m_NetworkManager.Shutdown(); + m_NetworkManager.StartServer(); + m_NetworkManager.Shutdown(); + } - Assert.False(singletonNetworkManager.IsServer); - Assert.False(singletonNetworkManager.IsClient); - Assert.False(singletonNetworkManager.IsHost); + [Test] + public void TestStartupServerState() + { + m_NetworkManager.StartServer(); - // Restart - singletonNetworkManager.StartServer(); + Assert.True(m_NetworkManager.IsServer); + Assert.False(m_NetworkManager.IsClient); + Assert.False(m_NetworkManager.IsHost); - // Ensure everything is still normal after restart - Assert.True(singletonNetworkManager.IsServer); - Assert.False(singletonNetworkManager.IsClient); - Assert.False(singletonNetworkManager.IsHost); + m_NetworkManager.Shutdown(); + } - // Final shutdown - singletonNetworkManager.Shutdown(); + [Test] + public void TestFlagShutdown() + { + m_NetworkManager.StartServer(); + m_NetworkManager.Shutdown(); - // Ensure everything is shut down - Assert.False(singletonNetworkManager.IsServer); - Assert.False(singletonNetworkManager.IsClient); - Assert.False(singletonNetworkManager.IsHost); + Assert.False(m_NetworkManager.IsServer); + Assert.False(m_NetworkManager.IsClient); + Assert.False(m_NetworkManager.IsHost); + } + [TearDown] + public void Teardown() + { // Cleanup - Object.DestroyImmediate(singletonNetworkManager.gameObject); + Object.DestroyImmediate(m_NetworkManager.gameObject); } } }