Skip to content

fix: NetcodeIntegrationTest preserve player prefab #2275

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,9 @@ 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;

Expand Down Expand Up @@ -250,6 +253,8 @@ private void CreatePlayerPrefab()

// Make it a prefab
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(networkObject);
m_PlayerPrefabMockNetworkManager = new NetworkManager();
networkObject.NetworkManagerOwner = m_PlayerPrefabMockNetworkManager;

OnCreatePlayerPrefab();

Expand Down Expand Up @@ -583,6 +588,12 @@ protected void ShutdownAndCleanUp()
Object.Destroy(m_PlayerPrefab);
m_PlayerPrefab = null;
}
// Destroy the mock NetworkManager
if (m_PlayerPrefabMockNetworkManager != null)
{
Object.Destroy(m_PlayerPrefabMockNetworkManager);
m_PlayerPrefabMockNetworkManager = null;
}
}

// Cleanup any remaining NetworkObjects
Expand Down Expand Up @@ -831,7 +842,7 @@ protected GameObject CreateNetworkObjectPrefab(string baseName)
var gameObject = new GameObject();
gameObject.name = baseName;
var networkObject = gameObject.AddComponent<NetworkObject>();
networkObject.NetworkManagerOwner = m_ServerNetworkManager;
networkObject.NetworkManagerOwner = m_PlayerPrefabMockNetworkManager;
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(networkObject);
var networkPrefab = new NetworkPrefab() { Prefab = gameObject };
m_ServerNetworkManager.NetworkConfig.NetworkPrefabs.Add(networkPrefab);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<GameObject> m_Prefabs = new List<GameObject>();

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();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be great if there could be a quick netvar sync or RPC call here, just to make sure those NMs are really connected together. I'm saying this cause we had silent fails in BR tests where NMs wouldn't connect and the tests would still pass (the connection failures would be outputed as warnings, ignored by our tests)

}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.