@@ -9,13 +9,19 @@ namespace Unity.Netcode.RuntimeTests
99{
1010 public class NetworkObjectNetworkClientOwnedObjectsTests : NetcodeIntegrationTest
1111 {
12+ private class DummyNetworkBehaviour : NetworkBehaviour
13+ {
14+
15+ }
16+
1217 protected override int NumberOfClients => 1 ;
1318 private NetworkPrefab m_NetworkPrefab ;
1419 protected override void OnServerAndClientsCreated ( )
1520 {
1621 // create prefab
1722 var gameObject = new GameObject ( "ClientOwnedObject" ) ;
1823 var networkObject = gameObject . AddComponent < NetworkObject > ( ) ;
24+ gameObject . AddComponent < DummyNetworkBehaviour > ( ) ;
1925 NetcodeIntegrationTestHelpers . MakeNetworkObjectTestPrefab ( networkObject ) ;
2026
2127 m_NetworkPrefab = ( new NetworkPrefab ( )
@@ -39,7 +45,7 @@ public IEnumerator ChangeOwnershipOwnedObjectsAddTest()
3945 serverObject . Spawn ( ) ;
4046
4147 // Provide enough time for the client to receive and process the spawned message.
42- yield return s_DefaultWaitForTick ;
48+ yield return WaitForMessageReceived < CreateObjectMessage > ( m_ClientNetworkManagers . ToList ( ) ) ;
4349
4450 // The object is owned by server
4551 Assert . False ( m_ServerNetworkManager . SpawnManager . GetClientOwnedObjects ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) . Any ( x => x . NetworkObjectId == serverObject . NetworkObjectId ) ) ;
@@ -48,13 +54,71 @@ public IEnumerator ChangeOwnershipOwnedObjectsAddTest()
4854 serverObject . ChangeOwnership ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) ;
4955
5056 // Provide enough time for the client to receive and process the change in ownership message.
51- yield return s_DefaultWaitForTick ;
57+ yield return WaitForMessageReceived < ChangeOwnershipMessage > ( m_ClientNetworkManagers . ToList ( ) ) ;
5258
5359 // Ensure it's now added to the list
54- yield return WaitForConditionOrTimeOut ( ( ) => m_ClientNetworkManagers [ 0 ] . SpawnManager . GetClientOwnedObjects ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) . Any ( x => x . NetworkObjectId == serverObject . NetworkObjectId ) ) ;
55- Assert . False ( s_GlobalTimeoutHelper . TimedOut , $ "Timed out waiting for client to gain ownership!") ;
5660 Assert . True ( m_ClientNetworkManagers [ 0 ] . SpawnManager . GetClientOwnedObjects ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) . Any ( x => x . NetworkObjectId == serverObject . NetworkObjectId ) ) ;
5761 Assert . True ( m_ServerNetworkManager . SpawnManager . GetClientOwnedObjects ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) . Any ( x => x . NetworkObjectId == serverObject . NetworkObjectId ) ) ;
5862 }
63+
64+ [ UnityTest ]
65+ public IEnumerator WhenOwnershipIsChanged_OwnershipValuesUpdateCorrectly ( )
66+ {
67+ NetworkObject serverObject = Object . Instantiate ( m_NetworkPrefab . Prefab ) . GetComponent < NetworkObject > ( ) ;
68+ serverObject . NetworkManagerOwner = m_ServerNetworkManager ;
69+ serverObject . Spawn ( ) ;
70+
71+ // Provide enough time for the client to receive and process the spawned message.
72+ yield return WaitForMessageReceived < CreateObjectMessage > ( m_ClientNetworkManagers . ToList ( ) ) ;
73+
74+ // The object is owned by server
75+ Assert . False ( m_ServerNetworkManager . SpawnManager . GetClientOwnedObjects ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) . Any ( x => x . NetworkObjectId == serverObject . NetworkObjectId ) ) ;
76+
77+ // Change the ownership
78+ serverObject . ChangeOwnership ( m_ClientNetworkManagers [ 0 ] . LocalClientId ) ;
79+
80+ // Provide enough time for the client to receive and process the change in ownership message.
81+ yield return WaitForMessageReceived < ChangeOwnershipMessage > ( m_ClientNetworkManagers . ToList ( ) ) ;
82+
83+ Assert . IsFalse ( serverObject . IsOwner ) ;
84+ Assert . IsFalse ( serverObject . IsOwnedByServer ) ;
85+ Assert . AreEqual ( m_ClientNetworkManagers [ 0 ] . LocalClientId , serverObject . OwnerClientId ) ;
86+
87+ var serverBehaviour = serverObject . GetComponent < DummyNetworkBehaviour > ( ) ;
88+ Assert . IsFalse ( serverBehaviour . IsOwner ) ;
89+ Assert . IsFalse ( serverBehaviour . IsOwnedByServer ) ;
90+ Assert . AreEqual ( m_ClientNetworkManagers [ 0 ] . LocalClientId , serverBehaviour . OwnerClientId ) ;
91+
92+ var clientObject = Object . FindObjectsOfType < NetworkObject > ( ) . Where ( ( obj ) => obj . NetworkManagerOwner == m_ClientNetworkManagers [ 0 ] ) . FirstOrDefault ( ) ;
93+
94+ Assert . IsNotNull ( clientObject ) ;
95+ Assert . IsTrue ( clientObject . IsOwner ) ;
96+ Assert . IsFalse ( clientObject . IsOwnedByServer ) ;
97+ Assert . AreEqual ( m_ClientNetworkManagers [ 0 ] . LocalClientId , clientObject . OwnerClientId ) ;
98+
99+ var clientBehaviour = clientObject . GetComponent < DummyNetworkBehaviour > ( ) ;
100+ Assert . IsTrue ( clientBehaviour . IsOwner ) ;
101+ Assert . IsFalse ( clientBehaviour . IsOwnedByServer ) ;
102+ Assert . AreEqual ( m_ClientNetworkManagers [ 0 ] . LocalClientId , clientBehaviour . OwnerClientId ) ;
103+
104+ serverObject . RemoveOwnership ( ) ;
105+
106+ // Provide enough time for the client to receive and process the change in ownership message.
107+ yield return WaitForMessageReceived < ChangeOwnershipMessage > ( m_ClientNetworkManagers . ToList ( ) ) ;
108+
109+ Assert . IsTrue ( serverObject . IsOwner ) ;
110+ Assert . IsTrue ( serverObject . IsOwnedByServer ) ;
111+ Assert . AreEqual ( NetworkManager . ServerClientId , serverObject . OwnerClientId ) ;
112+ Assert . IsTrue ( serverBehaviour . IsOwner ) ;
113+ Assert . IsTrue ( serverBehaviour . IsOwnedByServer ) ;
114+ Assert . AreEqual ( NetworkManager . ServerClientId , serverBehaviour . OwnerClientId ) ;
115+
116+ Assert . IsFalse ( clientObject . IsOwner ) ;
117+ Assert . IsTrue ( clientObject . IsOwnedByServer ) ;
118+ Assert . AreEqual ( NetworkManager . ServerClientId , clientObject . OwnerClientId ) ;
119+ Assert . IsFalse ( clientBehaviour . IsOwner ) ;
120+ Assert . IsTrue ( clientBehaviour . IsOwnedByServer ) ;
121+ Assert . AreEqual ( NetworkManager . ServerClientId , clientBehaviour . OwnerClientId ) ;
122+ }
59123 }
60124}
0 commit comments