-
Notifications
You must be signed in to change notification settings - Fork 461
Expand file tree
/
Copy pathNetworkObjectNetworkClientOwnedObjectsTests.cs
More file actions
129 lines (102 loc) · 6.24 KB
/
NetworkObjectNetworkClientOwnedObjectsTests.cs
File metadata and controls
129 lines (102 loc) · 6.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System.Collections;
using System.Linq;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using Unity.Netcode.TestHelpers.Runtime;
namespace Unity.Netcode.RuntimeTests
{
public class NetworkObjectNetworkClientOwnedObjectsTests : NetcodeIntegrationTest
{
private class DummyNetworkBehaviour : NetworkBehaviour
{
}
protected override int NumberOfClients => 1;
private NetworkPrefab m_NetworkPrefab;
protected override void OnServerAndClientsCreated()
{
// create prefab
var gameObject = new GameObject("ClientOwnedObject");
var networkObject = gameObject.AddComponent<NetworkObject>();
gameObject.AddComponent<DummyNetworkBehaviour>();
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(networkObject);
m_NetworkPrefab = (new NetworkPrefab()
{
Prefab = gameObject
});
m_ServerNetworkManager.NetworkConfig.NetworkPrefabs.Add(m_NetworkPrefab);
foreach (var client in m_ClientNetworkManagers)
{
client.NetworkConfig.NetworkPrefabs.Add(m_NetworkPrefab);
}
}
[UnityTest]
public IEnumerator ChangeOwnershipOwnedObjectsAddTest()
{
NetworkObject serverObject = Object.Instantiate(m_NetworkPrefab.Prefab).GetComponent<NetworkObject>();
serverObject.NetworkManagerOwner = m_ServerNetworkManager;
serverObject.Spawn();
// Provide enough time for the client to receive and process the spawned message.
yield return WaitForMessageReceived<CreateObjectMessage>(m_ClientNetworkManagers.ToList());
// The object is owned by server
Assert.False(m_ServerNetworkManager.SpawnManager.GetClientOwnedObjects(m_ClientNetworkManagers[0].LocalClientId).Any(x => x.NetworkObjectId == serverObject.NetworkObjectId));
// Change the ownership
serverObject.ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
// Provide enough time for the client to receive and process the change in ownership message.
yield return WaitForMessageReceived<ChangeOwnershipMessage>(m_ClientNetworkManagers.ToList());
// Ensure it's now added to the list
Assert.True(m_ClientNetworkManagers[0].SpawnManager.GetClientOwnedObjects(m_ClientNetworkManagers[0].LocalClientId).Any(x => x.NetworkObjectId == serverObject.NetworkObjectId));
Assert.True(m_ServerNetworkManager.SpawnManager.GetClientOwnedObjects(m_ClientNetworkManagers[0].LocalClientId).Any(x => x.NetworkObjectId == serverObject.NetworkObjectId));
}
[UnityTest]
public IEnumerator WhenOwnershipIsChanged_OwnershipValuesUpdateCorrectly()
{
NetworkObject serverObject = Object.Instantiate(m_NetworkPrefab.Prefab).GetComponent<NetworkObject>();
serverObject.NetworkManagerOwner = m_ServerNetworkManager;
serverObject.Spawn();
// Provide enough time for the client to receive and process the spawned message.
yield return WaitForMessageReceived<CreateObjectMessage>(m_ClientNetworkManagers.ToList());
// The object is owned by server
Assert.False(m_ServerNetworkManager.SpawnManager.GetClientOwnedObjects(m_ClientNetworkManagers[0].LocalClientId).Any(x => x.NetworkObjectId == serverObject.NetworkObjectId));
// Change the ownership
serverObject.ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
// Provide enough time for the client to receive and process the change in ownership message.
yield return WaitForMessageReceived<ChangeOwnershipMessage>(m_ClientNetworkManagers.ToList());
Assert.IsFalse(serverObject.IsOwner);
Assert.IsFalse(serverObject.IsOwnedByServer);
Assert.AreEqual(m_ClientNetworkManagers[0].LocalClientId, serverObject.OwnerClientId);
var serverBehaviour = serverObject.GetComponent<DummyNetworkBehaviour>();
Assert.IsFalse(serverBehaviour.IsOwner);
Assert.IsFalse(serverBehaviour.IsOwnedByServer);
Assert.AreEqual(m_ClientNetworkManagers[0].LocalClientId, serverBehaviour.OwnerClientId);
#if UNITY_2023_1_OR_NEWER
var clientObject = Object.FindObjectsByType<NetworkObject>(FindObjectsSortMode.InstanceID).Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault();
#else
var clientObject = Object.FindObjectsOfType<NetworkObject>().Where((obj) => obj.NetworkManagerOwner == m_ClientNetworkManagers[0]).FirstOrDefault();
#endif
Assert.IsNotNull(clientObject);
Assert.IsTrue(clientObject.IsOwner);
Assert.IsFalse(clientObject.IsOwnedByServer);
Assert.AreEqual(m_ClientNetworkManagers[0].LocalClientId, clientObject.OwnerClientId);
var clientBehaviour = clientObject.GetComponent<DummyNetworkBehaviour>();
Assert.IsTrue(clientBehaviour.IsOwner);
Assert.IsFalse(clientBehaviour.IsOwnedByServer);
Assert.AreEqual(m_ClientNetworkManagers[0].LocalClientId, clientBehaviour.OwnerClientId);
serverObject.RemoveOwnership();
// Provide enough time for the client to receive and process the change in ownership message.
yield return WaitForMessageReceived<ChangeOwnershipMessage>(m_ClientNetworkManagers.ToList());
Assert.IsTrue(serverObject.IsOwner);
Assert.IsTrue(serverObject.IsOwnedByServer);
Assert.AreEqual(NetworkManager.ServerClientId, serverObject.OwnerClientId);
Assert.IsTrue(serverBehaviour.IsOwner);
Assert.IsTrue(serverBehaviour.IsOwnedByServer);
Assert.AreEqual(NetworkManager.ServerClientId, serverBehaviour.OwnerClientId);
Assert.IsFalse(clientObject.IsOwner);
Assert.IsTrue(clientObject.IsOwnedByServer);
Assert.AreEqual(NetworkManager.ServerClientId, clientObject.OwnerClientId);
Assert.IsFalse(clientBehaviour.IsOwner);
Assert.IsTrue(clientBehaviour.IsOwnedByServer);
Assert.AreEqual(NetworkManager.ServerClientId, clientBehaviour.OwnerClientId);
}
}
}