@@ -10,111 +10,104 @@ namespace Unity.Netcode.RuntimeTests
10
10
/// <summary>
11
11
/// Tests that check OnNetworkDespawn being invoked
12
12
/// </summary>
13
- public class NetworkObjectOnNetworkDespawnTests
13
+ [ TestFixture ( HostOrServer . Host ) ]
14
+ [ TestFixture ( HostOrServer . Server ) ]
15
+ public class NetworkObjectOnNetworkDespawnTests : NetcodeIntegrationTest
14
16
{
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
+ }
17
23
24
+ protected override int NumberOfClients => 1 ;
18
25
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
+ }
20
31
21
32
internal class OnNetworkDespawnTestComponent : NetworkBehaviour
22
33
{
23
- public bool OnNetworkDespawnCalled { get ; internal set ; }
34
+ public static bool OnServerNetworkDespawnCalled { get ; internal set ; }
35
+ public static bool OnClientNetworkDespawnCalled { get ; internal set ; }
24
36
25
37
public override void OnNetworkSpawn ( )
26
38
{
27
- OnNetworkDespawnCalled = false ;
39
+ if ( IsServer )
40
+ {
41
+ OnServerNetworkDespawnCalled = false ;
42
+ }
43
+ else
44
+ {
45
+ OnClientNetworkDespawnCalled = false ;
46
+ }
28
47
base . OnNetworkSpawn ( ) ;
29
48
}
30
49
31
50
public override void OnNetworkDespawn ( )
32
51
{
33
- OnNetworkDespawnCalled = true ;
52
+ if ( IsServer )
53
+ {
54
+ OnServerNetworkDespawnCalled = true ;
55
+ }
56
+ else
57
+ {
58
+ OnClientNetworkDespawnCalled = true ;
59
+ }
34
60
base . OnNetworkDespawn ( ) ;
35
61
}
36
62
}
37
63
38
- [ UnitySetUp ]
39
- public IEnumerator Setup ( )
64
+ protected override void OnServerAndClientsCreated ( )
40
65
{
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 ) ;
44
67
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 ( ) ;
68
69
}
69
70
70
71
/// <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.
73
74
/// </summary>
74
75
[ UnityTest ]
75
- public IEnumerator TestNetworkObjectDespawnOnShutdown ( [ Values ( InstanceType . Server , InstanceType . Host , InstanceType . Client ) ] InstanceType despawnCheck )
76
+ public IEnumerator TestNetworkObjectDespawnOnShutdown ( )
76
77
{
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
-
94
78
// Spawn the test object
95
- var spawnedObject = Object . Instantiate ( m_NetworkObject ) ;
79
+ var spawnedObject = SpawnObject ( m_ObjectToSpawn , m_ServerNetworkManager ) ;
96
80
var spawnedNetworkObject = spawnedObject . GetComponent < NetworkObject > ( ) ;
97
- spawnedNetworkObject . NetworkManagerOwner = m_ServerHost ;
98
- spawnedNetworkObject . Spawn ( true ) ;
99
81
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 } !") ;
104
97
105
98
// 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!" ) ;
118
111
}
119
112
}
120
113
}
0 commit comments