Skip to content

Commit f926fae

Browse files
test - update
Fixing an issue with `ClientDisconnectMultipleClients` beginning to disconnect clients before they were connected. Added `UnityTransportTestHelpers.WaitForMultipleNetworkEvents` helper method to wait for a specific number of events of a specified type. Added a `UnityTransportTestHelpers.VerboseDebug` helper method.
1 parent 947dffa commit f926fae

File tree

2 files changed

+85
-17
lines changed

2 files changed

+85
-17
lines changed

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ internal class UnityTransportConnectionTests
2222
[UnityTearDown]
2323
public IEnumerator Cleanup()
2424
{
25+
LogEventsReceived = false;
2526
if (m_Server)
2627
{
2728
m_Server.Shutdown();
@@ -198,26 +199,32 @@ public IEnumerator ClientDisconnectSingleClient()
198199
[UnityTest]
199200
public IEnumerator ClientDisconnectMultipleClients()
200201
{
201-
InitializeTransport(out m_Server, out m_ServerEvents);
202-
m_Server.StartServer();
202+
LogEventsReceived = true;
203+
InitializeTransport(out m_Server, out m_ServerEvents, identifier: "Server");
204+
Assert.True(m_Server.StartServer(), "Failed to start server!");
205+
203206
for (int i = 0; i < k_NumClients; i++)
204207
{
205-
InitializeTransport(out m_Clients[i], out m_ClientsEvents[i]);
206-
m_Clients[i].StartClient();
208+
InitializeTransport(out m_Clients[i], out m_ClientsEvents[i], identifier: $"Client-{i + 1}");
209+
Assert.True(m_Clients[i].StartClient(), $"Failed to start client-{i + 1}");
210+
// Assure all clients have connected before disconnecting them
211+
yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ClientsEvents[i], 5);
207212
}
208-
yield return WaitForNetworkEvent(NetworkEvent.Connect, m_ClientsEvents[k_NumClients - 1]);
209213

210214
// Disconnect a single client.
215+
VerboseLog($"Disconnecting Client-1");
211216
m_Clients[0].DisconnectLocalClient();
212217

213-
yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents);
218+
yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents, 1);
214219

215220
// Disconnect all the other clients.
216221
for (int i = 1; i < k_NumClients; i++)
217222
{
223+
VerboseLog($"Disconnecting Client-{i + 1}");
218224
m_Clients[i].DisconnectLocalClient();
219225
}
220-
yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents, 5);
226+
227+
yield return WaitForMultipleNetworkEvents(NetworkEvent.Disconnect, m_ServerEvents, 4, 20);
221228

222229
// Check that we got the correct number of Disconnect events on the server.
223230
Assert.AreEqual(k_NumClients * 2, m_ServerEvents.Count);

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTestHelpers.cs

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,63 @@ internal static class UnityTransportTestHelpers
1919
// Wait for an event to appear in the given event list (must be the very next event).
2020
public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List<TransportEvent> events, float timeout = MaxNetworkEventWaitTime)
2121
{
22-
int initialCount = events.Count;
23-
float startTime = Time.realtimeSinceStartup;
24-
25-
while (Time.realtimeSinceStartup - startTime < timeout)
22+
var initialCount = events.Count;
23+
var startTime = Time.realtimeSinceStartup + timeout;
24+
var waitPeriod = new WaitForSeconds(0.01f);
25+
var conditionMet = false;
26+
while (startTime > Time.realtimeSinceStartup)
2627
{
2728
if (events.Count > initialCount)
2829
{
2930
Assert.AreEqual(type, events[initialCount].Type);
30-
yield break;
31+
conditionMet = true;
32+
break;
3133
}
3234

33-
yield return new WaitForSeconds(0.01f);
35+
yield return waitPeriod;
36+
}
37+
if (!conditionMet)
38+
{
39+
Assert.Fail("Timed out while waiting for network event.");
3440
}
41+
}
42+
43+
public static IEnumerator WaitForMultipleNetworkEvents(NetworkEvent type, List<TransportEvent> events, int count, float timeout = MaxNetworkEventWaitTime)
44+
{
45+
var initialCount = events.Count;
46+
var startTime = Time.realtimeSinceStartup + timeout;
47+
var waitPeriod = new WaitForSeconds(0.01f);
48+
var conditionMet = false;
49+
while (startTime > Time.realtimeSinceStartup)
50+
{
51+
// Wait until we have received at least (count) number of events
52+
if ((events.Count - initialCount) >= count)
53+
{
54+
var foundTypes = 0;
55+
// Look through all events received to match against the type we
56+
// are looking for.
57+
for (int i = initialCount; i < initialCount + count; i++)
58+
{
59+
if (type.Equals(events[i].Type))
60+
{
61+
foundTypes++;
62+
}
63+
}
64+
// If we reached the number of events we were expecting
65+
conditionMet = foundTypes == count;
66+
if (conditionMet)
67+
{
68+
// break from the wait loop
69+
break;
70+
}
71+
}
3572

36-
Assert.Fail("Timed out while waiting for network event.");
73+
yield return waitPeriod;
74+
}
75+
if (!conditionMet)
76+
{
77+
Assert.Fail("Timed out while waiting for network event.");
78+
}
3779
}
3880

3981
// Wait to ensure no event is sent.
@@ -53,12 +95,14 @@ public static IEnumerator EnsureNoNetworkEvent(List<TransportEvent> events, floa
5395
}
5496
}
5597

56-
5798
// Common code to initialize a UnityTransport that logs its events.
5899
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events,
59-
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
100+
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4, string identifier = "")
60101
{
61-
var logger = new TransportEventLogger();
102+
var logger = new TransportEventLogger()
103+
{
104+
Identifier = identifier,
105+
};
62106
events = logger.Events;
63107

64108
transport = new GameObject().AddComponent<UnityTransportTestComponent>();
@@ -75,6 +119,16 @@ public static void InitializeTransport(out UnityTransport transport, out List<Tr
75119
transport.Initialize();
76120
}
77121

122+
public static bool LogEventsReceived = false;
123+
124+
public static void VerboseLog(string msg)
125+
{
126+
if (LogEventsReceived)
127+
{
128+
Debug.Log($"{msg}");
129+
}
130+
}
131+
78132
// Information about an event generated by a transport (basically just the parameters that
79133
// are normally passed along to a TransportEventDelegate).
80134
internal struct TransportEvent
@@ -91,8 +145,15 @@ internal class TransportEventLogger
91145
{
92146
private readonly List<TransportEvent> m_Events = new List<TransportEvent>();
93147
public List<TransportEvent> Events => m_Events;
148+
149+
public string Identifier;
94150
public void HandleEvent(NetworkEvent type, ulong clientID, ArraySegment<byte> data, float receiveTime)
95151
{
152+
if (LogEventsReceived)
153+
{
154+
VerboseLog($"[{Identifier}]Tansport Event][{type}][{receiveTime}] Client-{clientID}");
155+
}
156+
96157
// Copy the data since the backing array will be reused for future messages.
97158
if (data != default(ArraySegment<byte>))
98159
{

0 commit comments

Comments
 (0)