Skip to content

Commit 9d6034e

Browse files
authored
test: automated test for TestRails (rpc, ownership) (#1358)
* test: automated test for TestRails 'Verify ServerRpc method replication and invocation being dropped/skipped for non-owners when RequireOwnership' * test: forgotten .meta file in previous commit
1 parent c84c5bf commit 9d6034e

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
using System;
2+
using System.Collections;
3+
using UnityEngine;
4+
using UnityEngine.TestTools;
5+
6+
namespace Unity.Netcode.RuntimeTests
7+
{
8+
public class RpcOwnershipTest : NetworkBehaviour
9+
{
10+
11+
}
12+
13+
public class RpcOwnershipObject : NetworkBehaviour
14+
{
15+
public int RequireOwnershipCount = 0;
16+
public int DoesntRequireOwnershipCount = 0;
17+
18+
[ServerRpc(RequireOwnership = true)]
19+
public void RequireOwnershipServerRpc()
20+
{
21+
RequireOwnershipCount++;
22+
}
23+
24+
[ServerRpc(RequireOwnership = false)]
25+
public void DoesntRequireOwnershipServerRpc()
26+
{
27+
DoesntRequireOwnershipCount++;
28+
}
29+
}
30+
31+
public class RpcOwnershipTests : BaseMultiInstanceTest
32+
{
33+
protected override int NbClients => 2;
34+
35+
private GameObject m_PrefabToSpawn;
36+
37+
private int m_ExpectedRequireOwnershipCount = 0;
38+
private int m_ExpectedDoesntRequireOwnershipCount = 0;
39+
40+
41+
[UnitySetUp]
42+
public override IEnumerator Setup()
43+
{
44+
yield return StartSomeClientsAndServerWithPlayers(useHost: true, nbClients: NbClients,
45+
updatePlayerPrefab: playerPrefab =>
46+
{
47+
var networkTransform = playerPrefab.AddComponent<RpcOwnershipTest>();
48+
m_PrefabToSpawn = PreparePrefab(typeof(RpcOwnershipObject));
49+
});
50+
}
51+
52+
public GameObject PreparePrefab(Type type)
53+
{
54+
var prefabToSpawn = new GameObject();
55+
prefabToSpawn.AddComponent(type);
56+
var networkObjectPrefab = prefabToSpawn.AddComponent<NetworkObject>();
57+
MultiInstanceHelpers.MakeNetworkObjectTestPrefab(networkObjectPrefab);
58+
m_ServerNetworkManager.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Prefab = prefabToSpawn });
59+
foreach (var clientNetworkManager in m_ClientNetworkManagers)
60+
{
61+
clientNetworkManager.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab() { Prefab = prefabToSpawn });
62+
}
63+
return prefabToSpawn;
64+
}
65+
66+
[UnityTest]
67+
public IEnumerator RpcOwnershipTest()
68+
{
69+
yield return RunTests(false);
70+
yield return RunTests(true);
71+
}
72+
73+
private IEnumerator RunTests(bool serverOwned)
74+
{
75+
m_ExpectedRequireOwnershipCount = 0;
76+
m_ExpectedDoesntRequireOwnershipCount = 0;
77+
78+
var spawnedObject = UnityEngine.Object.Instantiate(m_PrefabToSpawn);
79+
var netSpawnedObject = spawnedObject.GetComponent<NetworkObject>();
80+
netSpawnedObject.NetworkManagerOwner = m_ServerNetworkManager;
81+
82+
if (serverOwned)
83+
{
84+
netSpawnedObject.Spawn();
85+
}
86+
else
87+
{
88+
netSpawnedObject.SpawnWithOwnership(m_ClientNetworkManagers[1].LocalClientId);
89+
}
90+
91+
// send RPCs from server
92+
if (!serverOwned)
93+
{
94+
LogAssert.Expect(LogType.Error, "Only the owner can invoke a ServerRpc that requires ownership!");
95+
}
96+
else
97+
{
98+
m_ExpectedRequireOwnershipCount++;
99+
}
100+
101+
m_ExpectedDoesntRequireOwnershipCount++;
102+
spawnedObject.GetComponent<RpcOwnershipObject>().RequireOwnershipServerRpc();
103+
spawnedObject.GetComponent<RpcOwnershipObject>().DoesntRequireOwnershipServerRpc();
104+
105+
// get the matching object on the client side
106+
var serverClientPlayerResult = new MultiInstanceHelpers.CoroutineResultWrapper<NetworkObject>();
107+
yield return MultiInstanceHelpers.Run(
108+
MultiInstanceHelpers.GetNetworkObjectByRepresentation(
109+
x => x.NetworkObjectId == netSpawnedObject.NetworkObjectId,
110+
m_ClientNetworkManagers[1],
111+
serverClientPlayerResult));
112+
var netSpawnedObjectOnClient = serverClientPlayerResult.Result;
113+
netSpawnedObjectOnClient.NetworkManagerOwner = m_ClientNetworkManagers[1];
114+
115+
// send RPCs from the client
116+
if (serverOwned) // condition is reversed, compared to above
117+
{
118+
LogAssert.Expect(LogType.Error, "Only the owner can invoke a ServerRpc that requires ownership!");
119+
}
120+
else
121+
{
122+
m_ExpectedRequireOwnershipCount++;
123+
}
124+
125+
m_ExpectedDoesntRequireOwnershipCount++;
126+
netSpawnedObjectOnClient.GetComponent<RpcOwnershipObject>().RequireOwnershipServerRpc();
127+
netSpawnedObjectOnClient.GetComponent<RpcOwnershipObject>().DoesntRequireOwnershipServerRpc();
128+
129+
yield return new WaitForSeconds(1.0f);
130+
131+
// verify counts
132+
Debug.Assert(spawnedObject.GetComponent<RpcOwnershipObject>().RequireOwnershipCount == m_ExpectedRequireOwnershipCount);
133+
Debug.Assert(spawnedObject.GetComponent<RpcOwnershipObject>().DoesntRequireOwnershipCount == m_ExpectedDoesntRequireOwnershipCount);
134+
}
135+
}
136+
}

com.unity.netcode.gameobjects/Tests/Runtime/RpcOwnershipTests.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)