-
Notifications
You must be signed in to change notification settings - Fork 461
Expand file tree
/
Copy pathRpcPipelineTestComponent.cs
More file actions
176 lines (162 loc) · 7.38 KB
/
RpcPipelineTestComponent.cs
File metadata and controls
176 lines (162 loc) · 7.38 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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
using System.Collections.Generic;
using UnityEngine;
using MLAPI;
using MLAPI.Messaging;
namespace MLAPI.RuntimeTests
{
public class RpcPipelineTestComponent : NetworkedBehaviour
{
/// <summary>
/// PingSelfEnabled
/// Allows the external RPCQueueTest to begin testing or stop it
/// </summary>
public bool PingSelfEnabled;
/// <summary>
/// MaxIterations
/// How many times will we iterate through the various NetworkUpdateStage values?
/// (defaults to 2)
/// </summary>
public int MaxIterations = 2;
// Start is called before the first frame update
void Start()
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.Initialization;
m_Clientparms.Send.UpdateStage = NetworkUpdateStage.Update;
}
/// <summary>
/// IsTestComplete
/// Returns back whether the test has completed the total number of iterations
/// </summary>
/// <returns></returns>
public bool IsTestComplete()
{
if (m_Counter >= MaxIterations)
{
return true;
}
return false;
}
private int m_Counter = 0;
private float m_NextUpdate = 0.0f;
private ServerRpcParams m_Serverparms;
private ClientRpcParams m_Clientparms;
private NetworkUpdateStage m_LastUpdateStage;
// Update is called once per frame
void Update()
{
if (NetworkingManager.Singleton.IsListening && PingSelfEnabled && m_NextUpdate < Time.realtimeSinceStartup)
{
if (NetworkingManager.Singleton.IsListening && PingSelfEnabled && m_NextUpdate < Time.realtimeSinceStartup)
{
//As long as testing isn't completed, keep testing
if (!IsTestComplete())
{
m_NextUpdate = Time.realtimeSinceStartup + 0.5f;
m_LastUpdateStage = m_Serverparms.Send.UpdateStage;
m_StagesSent.Add(m_LastUpdateStage);
PingMySelfServerRPC(m_Serverparms);
m_Clientparms.Send.UpdateStage = m_Serverparms.Send.UpdateStage;
switch (m_Serverparms.Send.UpdateStage)
{
case NetworkUpdateStage.Initialization:
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.EarlyUpdate;
break;
}
case NetworkUpdateStage.EarlyUpdate:
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.FixedUpdate;
break;
}
case NetworkUpdateStage.FixedUpdate:
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.PreUpdate;
break;
}
case NetworkUpdateStage.PreUpdate:
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.Update;
break;
}
case NetworkUpdateStage.Update:
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.PreLateUpdate;
break;
}
case NetworkUpdateStage.PreLateUpdate:
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.PostLateUpdate;
break;
}
case NetworkUpdateStage.PostLateUpdate:
{
m_Serverparms.Send.UpdateStage = NetworkUpdateStage.Initialization;
break;
}
}
}
}
}
}
private List<NetworkUpdateStage> m_ServerStagesReceived = new List<NetworkUpdateStage>();
private List<NetworkUpdateStage> m_ClientStagesReceived = new List<NetworkUpdateStage>();
private List<NetworkUpdateStage> m_StagesSent = new List<NetworkUpdateStage>();
/// <summary>
/// ValidateUpdateStages
/// Assures all update stages were in alginment with one another
/// </summary>
/// <returns>true or false</returns>
public bool ValidateUpdateStages()
{
var Validated = false;
if (m_ServerStagesReceived.Count == m_ClientStagesReceived.Count && m_ClientStagesReceived.Count == m_StagesSent.Count)
{
for (int i = 0; i < m_StagesSent.Count; i++)
{
NetworkUpdateStage currentStage = m_StagesSent[i];
if (m_ServerStagesReceived[i] != currentStage)
{
Debug.LogFormat("ServerRpc Update Stage ( {0} ) is not equal to the current update stage ( {1} ) ", m_ServerStagesReceived[i].ToString(), currentStage.ToString());
return Validated;
}
if (m_ClientStagesReceived[i] != currentStage)
{
Debug.LogFormat("ClientRpc Update Stage ( {0} ) is not equal to the current update stage ( {1} ) ", m_ClientStagesReceived[i].ToString(), currentStage.ToString());
return Validated;
}
}
Validated = true;
}
return Validated;
}
/// <summary>
/// PingMySelfServerRPC
/// Server side RPC for testing
/// </summary>
/// <param name="parameters">server rpc parameters</param>
[ServerRpc]
void PingMySelfServerRPC(ServerRpcParams parameters)
{
Debug.Log("[HostClient][ServerRpc] invoked during the " + parameters.Receive.UpdateStage.ToString() + " stage.");
m_Clientparms.Send.UpdateStage = parameters.Receive.UpdateStage;
m_ServerStagesReceived.Add(m_Clientparms.Send.UpdateStage);
PingMySelfClientRpc(m_Clientparms);
}
/// <summary>
/// PingMySelfClientRpc
/// Client Side RPC called by PingMySelfServerRPC to validate both Client->Server and Server-Client pipeline is working
/// </summary>
/// <param name="parameters">client rpc parameters</param>
[ClientRpc]
void PingMySelfClientRpc(ClientRpcParams parameters)
{
m_ClientStagesReceived.Add(m_Clientparms.Send.UpdateStage);
Debug.Log("[HostServer][ClientRpc] invoked during the " + parameters.Receive.UpdateStage.ToString() + " stage. (previous output line should confirm this)");
//If we reached the last update state, then go ahead and increment our iteration counter
if (parameters.Receive.UpdateStage == NetworkUpdateStage.PostLateUpdate)
{
m_Counter++;
}
}
}
}