Skip to content

Commit f6a7c79

Browse files
test
Adding a general test for scenarios like this one.
1 parent cba01e9 commit f6a7c79

File tree

2 files changed

+170
-0
lines changed

2 files changed

+170
-0
lines changed
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
using System.Collections;
2+
using System.Text;
3+
using NUnit.Framework;
4+
using Unity.Netcode.TestHelpers.Runtime;
5+
using UnityEngine;
6+
using UnityEngine.TestTools;
7+
8+
namespace Unity.Netcode.RuntimeTests
9+
{
10+
/// <summary>
11+
/// General <see cref="NetworkVariable{T}"/> integration tests.
12+
/// </summary>
13+
[TestFixture(HostOrServer.Host)]
14+
[TestFixture(HostOrServer.DAHost)]
15+
[TestFixture(HostOrServer.Server)]
16+
internal class NetworkVariableGeneralTests : NetcodeIntegrationTest
17+
{
18+
protected override int NumberOfClients => 2;
19+
20+
private GameObject m_PrefabToSpawn;
21+
private GeneralNetVarTest m_AuthorityNetVarTest;
22+
23+
internal class GeneralNetVarTest : NetworkBehaviour
24+
{
25+
/// <summary>
26+
/// NetworkVariable that is set by the authority during spawn.
27+
/// </summary>
28+
public NetworkVariable<float> TestValueOnSpawn = new NetworkVariable<float>(default);
29+
/// <summary>
30+
/// NetworkVariable that is set by the authority during post spawn.
31+
/// </summary>
32+
public NetworkVariable<float> TestValueOnPostSpawn = new NetworkVariable<float>(default);
33+
34+
/// <summary>
35+
/// Field value set to <see cref="TestValueOnSpawn.Value"/> during <see cref="NetworkBehaviour.OnNetworkSpawn"/>.
36+
/// </summary>
37+
public float OnNetworkSpawnValue;
38+
39+
/// <summary>
40+
/// Field value set to <see cref="TestValueOnPostSpawn.Value"/> during <see cref="NetworkBehaviour.OnNetworkSpawn"/>.
41+
/// </summary>
42+
public float OnNetworkPostSpawnValue;
43+
44+
public override void OnNetworkSpawn()
45+
{
46+
if (HasAuthority)
47+
{
48+
TestValueOnSpawn.Value = Random.Range(0.01f, 100.0f);
49+
}
50+
else
51+
{
52+
// Only set these values during OnNetworkSpawn to
53+
// verify this value is valid for non-authority instances.
54+
OnNetworkSpawnValue = TestValueOnSpawn.Value;
55+
OnNetworkPostSpawnValue = TestValueOnPostSpawn.Value;
56+
}
57+
base.OnNetworkSpawn();
58+
}
59+
60+
protected override void OnNetworkPostSpawn()
61+
{
62+
if (HasAuthority)
63+
{
64+
TestValueOnPostSpawn.Value = Random.Range(0.01f, 100.0f);
65+
}
66+
base.OnNetworkPostSpawn();
67+
}
68+
}
69+
70+
public NetworkVariableGeneralTests(HostOrServer host) : base(host) { }
71+
72+
protected override void OnServerAndClientsCreated()
73+
{
74+
m_PrefabToSpawn = CreateNetworkObjectPrefab("TestNetVar");
75+
m_PrefabToSpawn.AddComponent<GeneralNetVarTest>();
76+
base.OnServerAndClientsCreated();
77+
}
78+
79+
/// <summary>
80+
/// Verifies that upon spawn or post spawn the value is set within OnNetworkSpawn on the
81+
/// non-authority instances.
82+
/// </summary>
83+
private bool SpawnValuesMatch(StringBuilder errorLog)
84+
{
85+
var authority = GetAuthorityNetworkManager();
86+
var authorityOnSpawnValue = m_AuthorityNetVarTest.TestValueOnSpawn.Value;
87+
var authorityOnPostSpawnValue = m_AuthorityNetVarTest.TestValueOnPostSpawn.Value;
88+
foreach (var networkManager in m_NetworkManagers)
89+
{
90+
if (authority)
91+
{
92+
continue;
93+
}
94+
if (!networkManager.SpawnManager.SpawnedObjects.ContainsKey(m_AuthorityNetVarTest.NetworkObjectId))
95+
{
96+
errorLog.AppendLine($"[{networkManager.name}] Does not have a spawned instance of {m_AuthorityNetVarTest.name}!");
97+
continue;
98+
}
99+
var netVarTest = networkManager.SpawnManager.SpawnedObjects[m_AuthorityNetVarTest.NetworkObjectId].GetComponent<GeneralNetVarTest>();
100+
if (netVarTest.OnNetworkSpawnValue != authorityOnSpawnValue)
101+
{
102+
errorLog.AppendLine($"[{networkManager.name}][OnNetworkSpawn Value] Non-authority value: {netVarTest.OnNetworkSpawnValue} does not match " +
103+
$"the authority value: {authorityOnSpawnValue}!");
104+
}
105+
if (netVarTest.OnNetworkPostSpawnValue != authorityOnPostSpawnValue)
106+
{
107+
errorLog.AppendLine($"[{networkManager.name}][OnNetworkPostSpawn Value] Non-authority value: {netVarTest.OnNetworkPostSpawnValue} does not match " +
108+
$"the authority value: {authorityOnPostSpawnValue}!");
109+
}
110+
}
111+
return errorLog.Length == 0;
112+
}
113+
114+
/// <summary>
115+
/// Verifies that changing the value synchronizes properly.
116+
/// </summary>
117+
private bool ChangedValueMatches(StringBuilder errorLog)
118+
{
119+
var authority = GetAuthorityNetworkManager();
120+
var authorityValue = m_AuthorityNetVarTest.TestValueOnSpawn.Value;
121+
foreach (var networkManager in m_NetworkManagers)
122+
{
123+
if (authority)
124+
{
125+
continue;
126+
}
127+
var netVarTest = networkManager.SpawnManager.SpawnedObjects[m_AuthorityNetVarTest.NetworkObjectId].GetComponent<GeneralNetVarTest>();
128+
if (netVarTest.TestValueOnSpawn.Value != authorityValue)
129+
{
130+
errorLog.AppendLine($"[{networkManager.name}][Changed] Non-auhoroty value: {netVarTest.TestValueOnSpawn.Value} does not match " +
131+
$"the authority value: {authorityValue}!");
132+
}
133+
}
134+
return errorLog.Length == 0;
135+
}
136+
137+
/// <summary>
138+
/// Validates when the authority applies a <see cref="NetworkVariable{T}"/> value during spawn or
139+
/// post spawn of a newly instantiated and spawned object the value is set by the time non-authority
140+
/// instances invoke <see cref="NetworkBehaviour.OnNetworkSpawn"/>.
141+
/// </summary>
142+
[UnityTest]
143+
public IEnumerator ApplyValueDuringSpawnSequence()
144+
{
145+
var authority = GetAuthorityNetworkManager();
146+
m_AuthorityNetVarTest = SpawnObject(m_PrefabToSpawn, authority).GetComponent<GeneralNetVarTest>();
147+
yield return WaitForSpawnedOnAllOrTimeOut(m_AuthorityNetVarTest.gameObject);
148+
AssertOnTimeout($"Not all clients spawned {m_AuthorityNetVarTest.name}!");
149+
150+
yield return WaitForConditionOrTimeOut(SpawnValuesMatch);
151+
AssertOnTimeout($"Values did not match for {m_AuthorityNetVarTest.name}!");
152+
153+
// Verify late joined clients synchronize correctly
154+
yield return CreateAndStartNewClient();
155+
156+
yield return WaitForSpawnedOnAllOrTimeOut(m_AuthorityNetVarTest.gameObject);
157+
AssertOnTimeout($"Not all clients spawned {m_AuthorityNetVarTest.name}!");
158+
159+
yield return WaitForConditionOrTimeOut(SpawnValuesMatch);
160+
AssertOnTimeout($"Values did not match for {m_AuthorityNetVarTest.name}!");
161+
162+
// Verify changing the value synchronizes properly
163+
m_AuthorityNetVarTest.TestValueOnSpawn.Value += Random.Range(0.01f, 100.0f);
164+
yield return WaitForConditionOrTimeOut(ChangedValueMatches);
165+
AssertOnTimeout($"Values did not match for {m_AuthorityNetVarTest.name}!");
166+
}
167+
}
168+
}

com.unity.netcode.gameobjects/Tests/Runtime/NetworkVariable/NetworkVariableGeneralTests.cs.meta

Lines changed: 2 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)