@@ -10,111 +10,104 @@ namespace Unity.Netcode.RuntimeTests
1010 /// <summary>
1111 /// Tests that check OnNetworkDespawn being invoked
1212 /// </summary>
13- public class NetworkObjectOnNetworkDespawnTests
13+ [ TestFixture ( HostOrServer . Host ) ]
14+ [ TestFixture ( HostOrServer . Server ) ]
15+ public class NetworkObjectOnNetworkDespawnTests : NetcodeIntegrationTest
1416 {
15- private NetworkManager m_ServerHost ;
16- private NetworkManager [ ] m_Clients ;
17+ private const string k_ObjectName = "TestDespawn" ;
18+ public enum InstanceType
19+ {
20+ Server ,
21+ Client
22+ }
1723
24+ protected override int NumberOfClients => 1 ;
1825 private GameObject m_ObjectToSpawn ;
19- private NetworkObject m_NetworkObject ;
26+ private HostOrServer m_HostOrServer ;
27+ public NetworkObjectOnNetworkDespawnTests ( HostOrServer hostOrServer ) : base ( hostOrServer )
28+ {
29+ m_HostOrServer = hostOrServer ;
30+ }
2031
2132 internal class OnNetworkDespawnTestComponent : NetworkBehaviour
2233 {
23- public bool OnNetworkDespawnCalled { get ; internal set ; }
34+ public static bool OnServerNetworkDespawnCalled { get ; internal set ; }
35+ public static bool OnClientNetworkDespawnCalled { get ; internal set ; }
2436
2537 public override void OnNetworkSpawn ( )
2638 {
27- OnNetworkDespawnCalled = false ;
39+ if ( IsServer )
40+ {
41+ OnServerNetworkDespawnCalled = false ;
42+ }
43+ else
44+ {
45+ OnClientNetworkDespawnCalled = false ;
46+ }
2847 base . OnNetworkSpawn ( ) ;
2948 }
3049
3150 public override void OnNetworkDespawn ( )
3251 {
33- OnNetworkDespawnCalled = true ;
52+ if ( IsServer )
53+ {
54+ OnServerNetworkDespawnCalled = true ;
55+ }
56+ else
57+ {
58+ OnClientNetworkDespawnCalled = true ;
59+ }
3460 base . OnNetworkDespawn ( ) ;
3561 }
3662 }
3763
38- [ UnitySetUp ]
39- public IEnumerator Setup ( )
64+ protected override void OnServerAndClientsCreated ( )
4065 {
41- Assert . IsTrue ( NetcodeIntegrationTestHelpers . Create ( 1 , out m_ServerHost , out m_Clients ) ) ;
42-
43- m_ObjectToSpawn = NetcodeIntegrationTestHelpers . CreateNetworkObjectPrefab ( nameof ( NetworkObjectOnNetworkDespawnTests ) , m_ServerHost , m_Clients ) ;
66+ m_ObjectToSpawn = CreateNetworkObjectPrefab ( k_ObjectName ) ;
4467 m_ObjectToSpawn . AddComponent < OnNetworkDespawnTestComponent > ( ) ;
45- m_NetworkObject = m_ObjectToSpawn . GetComponent < NetworkObject > ( ) ;
46-
47- yield return null ;
48- }
49-
50- [ UnityTearDown ]
51- public IEnumerator Teardown ( )
52- {
53- // Shutdown and clean up both of our NetworkManager instances
54- if ( m_ObjectToSpawn )
55- {
56- Object . Destroy ( m_ObjectToSpawn ) ;
57- m_ObjectToSpawn = null ;
58- }
59- NetcodeIntegrationTestHelpers . Destroy ( ) ;
60- yield return null ;
61- }
62-
63- public enum InstanceType
64- {
65- Server ,
66- Host ,
67- Client
68+ base . OnServerAndClientsCreated ( ) ;
6869 }
6970
7071 /// <summary>
71- /// Tests that a spawned NetworkObject's associated NetworkBehaviours will have
72- /// their OnNetworkDespawn invoked during NetworkManager shutdown.
72+ /// This test validates that <see cref="NetworkBehaviour.OnNetworkDespawn"/> is invoked when the
73+ /// <see cref=" NetworkManager"/> is shutdown.
7374 /// </summary>
7475 [ UnityTest ]
75- public IEnumerator TestNetworkObjectDespawnOnShutdown ( [ Values ( InstanceType . Server , InstanceType . Host , InstanceType . Client ) ] InstanceType despawnCheck )
76+ public IEnumerator TestNetworkObjectDespawnOnShutdown ( )
7677 {
77- var useHost = despawnCheck != InstanceType . Server ;
78- var networkManager = despawnCheck == InstanceType . Host || despawnCheck == InstanceType . Server ? m_ServerHost : m_Clients [ 0 ] ;
79-
80- // Start the instances
81- if ( ! NetcodeIntegrationTestHelpers . Start ( useHost , m_ServerHost , m_Clients ) )
82- {
83- Debug . LogError ( "Failed to start instances" ) ;
84- Assert . Fail ( "Failed to start instances" ) ;
85- }
86-
87- // [Client-Side] Wait for a connection to the server
88- yield return NetcodeIntegrationTestHelpers . WaitForClientsConnected ( m_Clients , null , 512 ) ;
89-
90- // [Host-Server-Side] Check to make sure all clients are connected
91- var clientCount = useHost ? m_Clients . Length + 1 : m_Clients . Length ;
92- yield return NetcodeIntegrationTestHelpers . WaitForClientsConnectedToServer ( m_ServerHost , clientCount , null , 512 ) ;
93-
9478 // Spawn the test object
95- var spawnedObject = Object . Instantiate ( m_NetworkObject ) ;
79+ var spawnedObject = SpawnObject ( m_ObjectToSpawn , m_ServerNetworkManager ) ;
9680 var spawnedNetworkObject = spawnedObject . GetComponent < NetworkObject > ( ) ;
97- spawnedNetworkObject . NetworkManagerOwner = m_ServerHost ;
98- spawnedNetworkObject . Spawn ( true ) ;
9981
100- // Get the spawned object relative to which NetworkManager instance we are testing.
101- var relativeSpawnedObject = new NetcodeIntegrationTestHelpers . ResultWrapper < NetworkObject > ( ) ;
102- yield return NetcodeIntegrationTestHelpers . GetNetworkObjectByRepresentation ( ( x => x . GetComponent < OnNetworkDespawnTestComponent > ( ) != null ) , networkManager , relativeSpawnedObject ) ;
103- var onNetworkDespawnTestComponent = relativeSpawnedObject . Result . GetComponent < OnNetworkDespawnTestComponent > ( ) ;
82+ // Wait for the client to spawn the object
83+ yield return WaitForConditionOrTimeOut ( ( ) =>
84+ {
85+ if ( ! s_GlobalNetworkObjects . ContainsKey ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) )
86+ {
87+ return false ;
88+ }
89+ if ( ! s_GlobalNetworkObjects [ m_ClientNetworkManagers [ 0 ] . LocalClientId ] . ContainsKey ( spawnedNetworkObject . NetworkObjectId ) )
90+ {
91+ return false ;
92+ }
93+ return true ;
94+ } ) ;
95+
96+ AssertOnTimeout ( $ "Timed out waiting for client to spawn { k_ObjectName } !") ;
10497
10598 // Confirm it is not set before shutting down the NetworkManager
106- Assert . IsFalse ( onNetworkDespawnTestComponent . OnNetworkDespawnCalled ) ;
107-
108- // Shutdown the NetworkManager instance we are testing.
109- networkManager . Shutdown ( ) ;
110-
111- // Since shutdown is now delayed until the post frame update
112- // just wait 2 frames before checking to see if OnNetworkDespawnCalled is true
113- var currentFrame = Time . frameCount + 2 ;
114- yield return new WaitUntil ( ( ) => Time . frameCount <= currentFrame ) ;
115-
116- // Confirm that OnNetworkDespawn is invoked after shutdown
117- Assert . IsTrue ( onNetworkDespawnTestComponent . OnNetworkDespawnCalled ) ;
99+ Assert . IsFalse ( OnNetworkDespawnTestComponent . OnClientNetworkDespawnCalled , "[Client-side] despawn state is already set (should not be set at this point)!" ) ;
100+ Assert . IsFalse ( OnNetworkDespawnTestComponent . OnServerNetworkDespawnCalled , $ "[ { m_HostOrServer } -side] despawn state is already set (should not be set at this point)!" ) ;
101+
102+ // Shutdown the client-side first to validate the client-side instance invokes OnNetworkDespawn
103+ m_ClientNetworkManagers [ 0 ] . Shutdown ( ) ;
104+ yield return WaitForConditionOrTimeOut ( ( ) => OnNetworkDespawnTestComponent . OnClientNetworkDespawnCalled ) ;
105+ AssertOnTimeout ( $ "[Client-side] Timed out waiting for { k_ObjectName } 's { nameof ( NetworkBehaviour . OnNetworkDespawn ) } to be invoked!" ) ;
106+
107+ // Shutdown the servr-host-side second to validate servr-host-side instance invokes OnNetworkDespawn
108+ m_ServerNetworkManager . Shutdown ( ) ;
109+ yield return WaitForConditionOrTimeOut ( ( ) => OnNetworkDespawnTestComponent . OnClientNetworkDespawnCalled ) ;
110+ AssertOnTimeout ( $ "[ { m_HostOrServer } -side]Timed out waiting for { k_ObjectName } 's { nameof ( NetworkBehaviour . OnNetworkDespawn ) } to be invoked!" ) ;
118111 }
119112 }
120113}
0 commit comments